Load packages to be used in the analysis

library(here)
library(tidyverse)
library(readxl)
# "RODBC", "here", "rnaturalearth", "rnaturalearthdata", "maps", "mapdata", "marmap", "rgdal")
 

Read in the EMA data files


BASIS_Zoo_1999_2004 <- read_xlsx(here( "data", "Raw-Data", "EMA-Historical-Data", "BASIS_Zoo_1999_2004.xlsx"), col_types = c("text", "text", "text", "numeric", "text", "numeric", "date", "date", "date", "numeric", "numeric", "text", "numeric", "numeric", "text", "text", "numeric", "text", "numeric", "text", "text", "text", "text", "numeric", "numeric", "numeric", "text", "text", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric"))


BASIS_Zoo_2005_2009 <- read_xlsx (here("data", "Raw-Data", "EMA-Historical-Data", "BASIS_Zoo_2005_2009.xlsx"), col_types = c("text", "text", "text", "numeric", "text", "numeric", "date", "date", "date", "numeric", "numeric", "text", "numeric", "numeric", "text", "text", "numeric", "text", "numeric", "text", "text", "text", "text", "numeric", "numeric", "numeric", "text", "text", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric"))

BASIS_Zoo_2010_2013 <- read_xlsx (here("data", "Raw-Data", "EMA-Historical-Data", "BASIS_Zoo_2010_2013.xlsx"), col_types = c("text", "text", "text", "numeric", "text", "numeric", "date", "date", "date", "numeric", "numeric", "text", "numeric", "numeric", "text", "text", "numeric", "text", "numeric", "text", "text", "text", "text", "numeric", "numeric", "numeric", "text", "text", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric"))

BASIS_Zoo_2014_2017 <- read_xlsx (here("data", "Raw-Data", "EMA-Historical-Data", "BASIS_Zoo_2014_2017_LonCorrected.xlsx"), col_types = c("text", "text", "text", "numeric", "text", "numeric", "date", "date", "date", "numeric", "numeric", "text", "numeric", "numeric", "text", "text", "numeric", "text", "numeric", "text", "text", "text", "text", "numeric", "numeric", "numeric", "text", "text", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric"))

EMA_Combined <- rbind(BASIS_Zoo_1999_2004, BASIS_Zoo_2005_2009, BASIS_Zoo_2010_2013, BASIS_Zoo_2014_2017)

rm(BASIS_Zoo_1999_2004, BASIS_Zoo_2005_2009, BASIS_Zoo_2010_2013, BASIS_Zoo_2014_2017)

Convert EMA fields into EcoDAAT fields


#Create DAY, MONTH, YEAR columns from "HaulDate"

EMA_Combined_Recode <-  EMA_Combined

EMA_Combined_Recode <- separate(EMA_Combined_Recode, HaulDate, c("YEAR", "MONTH", "DAY"), sep="-")

#Delete year column from the HaulID as there is already a year column

EMA_Combined_Recode$YEAR <- NULL
EMA_Combined_Recode <- rename(EMA_Combined_Recode, YEAR = Year)


#Extract Cruise code 
EMA_Combined_Recode$CRUISE <- substring (EMA_Combined_Recode$StationID, 5,6)

EMA_Combined_Recode$CRUISE_ID <- substring (EMA_Combined_Recode$StationID, 7,8)

#Recod Cruise code with ship ID and 

EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "01"] <- "SS"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "02"] <- "NWE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "03"] <- "DY"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "04"] <- "GP"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "05"] <- "EE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "06"] <- "HE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "07"] <- "LU"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "08"] <- "BE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "09"] <- "AE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "10"] <- "JC"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "11"] <- "ST"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "12"] <- "CH"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "13"] <- "SA"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "14"] <- "QU"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "15"] <- "CF"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "16"] <- "OS"

#Get last two digits of year

EMA_Combined_Recode$CRUISE_YEAR <- substring (EMA_Combined_Recode$YEAR, 3,4)

#Combined CRUISE with 

EMA_Combined_Recode <- unite(EMA_Combined_Recode, "CRUISE", CRUISE, CRUISE_YEAR, sep="")

EMA_Combined_Recode <- unite(EMA_Combined_Recode, "CRUISE", CRUISE, CRUISE_ID, sep = "-")


#Count number of cruises in the EMA dataset

EMA_Combined_Recode_byCRUISE <- group_by(EMA_Combined_Recode, CRUISE)
EMA_Combined_Recode_CruiseCount <- summarise(EMA_Combined_Recode_byCRUISE, n_distinct(YEAR))

ungroup(EMA_Combined_Recode)


#Recode cruises to match nomenclature change in 2013 (i.e., 2DY12 becomes DY13-02 in 2013)

EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="BE11-01"] <- "1BE11"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="BE12-01"] <- "1BE12"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY07-02"] <- "2OD07"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY08-06"] <- "6DY08"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY09-05"] <- "5DY09"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY10-04"] <- "4DY10"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY11-04"] <- "4DY11"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY12-03"] <- "3DY12"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="EE09-01"] <- "1EE09"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="EE10-01"] <- "1EE10"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="GP00-01"] <- "1GP00"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="GP99-01"] <- "1GP99"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="NWE06-01"] <- "1NW06"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS02-01"] <- "1SS02"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS03-01"] <- "1SS03"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS04-01"] <- "1SS04"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS05-01"] <- "1SS05"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS06-01"] <- "1SS06"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS07-01"] <- "1SS07"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="NWE17-05"] <- "NW17-05"

#Remove a few files

rm(EMA_Combined_Recode_byCRUISE, EMA_Combined_Recode_CruiseCount)


#Rename Abundance to EST_NUM_PERM3

EMA_Combined_Recode <- rename(EMA_Combined_Recode, EST_NUM_PERM3 = Abundance)

#Rename GearDepth to MAX_GEAR_DEPTH and use to calculate EST_NUM_PERM3

EMA_Combined_Recode <- rename(EMA_Combined_Recode, MAX_GEAR_DEPTH = GearDepth)

#Compute EST_NUM_PERM2 = EST_NUM_PERM3 * MAX_GEAR_DEPTH

EMA_Combined_Recode$EST_NUM_PERM2 <- EMA_Combined_Recode$EST_NUM_PERM3*EMA_Combined_Recode$MAX_GEAR_DEPTH

#Create columns GEAR_NAME, MESH from GearCode column

EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Bongo153"] <- "20BON_153"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Bongo333"] <- "60BON_333"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Bongo505"] <- "60BON_505"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Bongo80"] <- "80BON_153"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Juday"] <- "Juday_168"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "PairoVET"] <- "PairoVET_153"

EMA_Combined_Recode <- separate(EMA_Combined_Recode, GearCode, c("GEAR_NAME", "MESH"), sep = "_")

#Rename GearInTime to GMT_DATE_TIME_TXT

EMA_Combined_Recode <- rename(EMA_Combined_Recode, GMT_DATE_TIME_TXT = GearInTime)
  
#Rename Quality to HAUL_PERFORMANCE and recode to match EcoDAAT 

EMA_Combined_Recode <- rename(EMA_Combined_Recode, HAUL_PERFORMANCE = Quality)

EMA_Combined_Recode$HAUL_PERFORMANCE[EMA_Combined_Recode$HAUL_PERFORMANCE == "G"] <- "GOOD"
EMA_Combined_Recode$HAUL_PERFORMANCE[EMA_Combined_Recode$HAUL_PERFORMANCE == "Q"] <- "QUEST"

#Create LAT and LON column from GearInLatitude and Gear in Longitude

EMA_Combined_Recode <- rename(EMA_Combined_Recode, LAT = GearInLatitude)

EMA_Combined_Recode <- rename(EMA_Combined_Recode, LON = GearInLongitude)

#Create column SEX_NAME from Sex and recode to match EcoDAAT categories

EMA_Combined_Recode <- rename(EMA_Combined_Recode, SEX_NAME = Sex)

EMA_Combined_Recode$SEX_NAME[EMA_Combined_Recode$SEX_NAME == "M"] <- "MALE"
EMA_Combined_Recode$SEX_NAME[EMA_Combined_Recode$SEX_NAME == "F"] <- "FEMALE"
EMA_Combined_Recode$SEX_NAME[EMA_Combined_Recode$SEX_NAME == "U"] <- "NOT DETERMINED"

#EMA Size categories are numerous, so keep this column, but rename as SIZE_NAME for merging

EMA_Combined_Recode <- rename(EMA_Combined_Recode, SIZE_NAME = Size)

#Create STAGE_NAME category by renaming "StageCode" and recoding

EMA_Combined_Recode <- rename(EMA_Combined_Recode, STAGE_NAME = StageCode)

EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "A"] <- "ADULT"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "A & J"] <- "A + J (ADULT/JUVENILE)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "adult"] <- "ADULT"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Adult"] <- "ADULT"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1"] <- "C - 1 (COPEPODITE I)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-2"] <- "C-1 TO C-2"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-3"] <- "C-1 TO C-3"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-4"] <- "C-1 TO C-4"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-5"] <- "C-1 TO C-5"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-C4"] <- "C-1 TO C-4"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C2"] <- "C - 2 (COPEPODITE II)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C2-C3"] <- "C-2 TO C-3"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C2-C5"] <- "C-2 TO C-5"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C3"] <- "C - 3 (COPEPODITE III)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C3-C4"] <- "C-3 TO C-4"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C3-C5"] <- "C-3 TO C-5"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C4"] <- "C - 4 (COPEPODITE IV)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C4-C5"] <- "C-4 TO C-5"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C4-C6"] <- "C-4 TO C-6"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C5"] <- "C - 5 (COPEPODITE V)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C6"] <- "ADULT"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "calyptopis"] <- "CALYPTOPIS (STAGE NOT DETERMINED)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "calyptopis 1"] <- "CALYPTOPIS (STAGE NOT DETERMINED)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "calyptopis 2"] <- "CALYPTOPIS (STAGE NOT DETERMINED)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "calyptopis 3"] <- "CALYPTOPIS (STAGE NOT DETERMINED)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "cypris"] <- "CYPRIS"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Cypris"] <- "CYPRIS"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "egg"] <- "EGG"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Egg"] <- "EGG"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "furcilia"] <- "FURCILIA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Furcilia"] <- "FURCILIA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "J"] <- "JUVENILE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "juvenile"] <- "JUVENILE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Juvenile"] <- "JUVENILE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "larva"] <- "LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Larva"] <- "LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "larval"] <- "LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Larval"] <- "LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "medusa"] <- "MEDUSA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Medusa"] <- "MEDUSA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "megalopa"] <- "MEGALOPAE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Megalopa"] <- "MEGALOPAE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "nauplius"] <- "NAUPLIUS"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Nauplius"] <- "NAUPLIUS"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "ND"] <- "NOT DETERMINED"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "post-larva"] <- "POST LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "U"] <- "NOT DETERMINED"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "zoea"] <- "ZOEA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Zoea"] <- "ZOEA"

#Create Column STATION_NAME by using the last 3 digits of StationID

EMA_Combined_Recode$STATION_NAME<- substring (EMA_Combined_Recode$StationID, 9,11)

#Create TAXON_NAME column and recode to match EcoDAAT

EMA_Combined_Recode <- rename(EMA_Combined_Recode, TAXON_NAME = Current_Name)

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Acanthomysis sp."] <- "Acanthomysis spp."

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Acanthomysis stelleri"] <- "Acanthomysis stelleri (Exacanthomysis arctopacifica)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Anthoathecatae"] <- "Anthoathecata (Anthomedusae)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Cancridae"] <- "Cancridae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Candacia columbiae"] <- "Candacia Columbiae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Caprellidea"] <- "Caprellidae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Clytia gregaria"] <- "Clytia gregaria (Phialidium gregarium)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Cnidaria"] <- "Cnidarian medusae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Corophium spp."] <- "Corophium"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Disacanthomysis dybowskii"] <- "Discanthomysis (Acanthomysis) Dybowskii"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Epilabidocera amphitrites"] <- "Epilabidocera amphitrites (E. longipedata)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Epilabidocera longipedata"] <- "Epilabidocera amphitrites (E. longipedata)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Euphausia spp."] <- "Euphausiacea"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Eurytemora pacifica"] <- "Eurytemora pacifica (E. johanseni)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Eurytemora sp."] <- "Eurytemora spp."

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Gammaridae"] <- "Gammaridea (Unidentifiable)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Gammaridea"] <- "Gammaridea (Unidentifiable)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Hippolytidae"] <- "Hippolytidae (Caridea)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Hydromedusae (Hydroidolina"] <- "Hydromedusae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Leptothecatae"] <- "Leptothecata (Leptomedusae)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Lithodidae"] <- "Lithodidae (Anomura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Majidae"] <- "Majidae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Meterythrops robusta"] <- "Meterythrops robustus (M. robusta)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Mysida"] <- "Mysida (Unidentifiable)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Octopoda"] <- "Octopodiformes (Octopus) larvae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Oithona setigera"] <- "Oithona setigera (O. spinirostris)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Oithona spinirostris"] <- "Oithona setigera (O. spinirostris)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Chionoecetes spp."] <- "Oregoniidae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Hyas spp."] <- "Oregoniidae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Oregoniidae"] <- "Oregoniidae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Pacifacanthomysis nephrophthalma"] <- "Pacifacanthomysis (Acanthomysis) nephrophthalma"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Paguridae"] <- "Paguridae (Anomura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Paraeuchaeta elongata"] <- "Paraeuchaeta elongata (Euchaeta elongata)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Parasagitta elegans"] <- "Parasagitta (Sagitta) elegans"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Phoronida (actinotroch larva)"] <- "Phoronida actinotroch (larvae)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Podon leuckartii"] <- "Podon leuckarti"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Pseudoamallothrix ovata"] <- "Pseudoamallothrix (scolecithricella) ovata"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Syrrhoe"] <- "Syrrhoe spp."

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Tessarabrachion oculatus"] <- "Tessarabrachion oculatum"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Thecosomata"] <- "Thecosomata (Unidentifiable)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Themisto pacifica"] <- "Themisto pacifica (Parathemisto pacifica)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Triconia sp."] <- "Triconia spp."

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Calanidae"] <- "Unidentified Calanids"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Calanoida"] <- "Unidentified Calanids"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Xenacanthomysis pseudomacropsis"] <- "Xenoacanthomysis (Acanthomysis) pseudomacropsis"



#Create VOLUME_FILTERED column by renaming TowVOlume column

EMA_Combined_Recode <- rename(EMA_Combined_Recode, VOLUME_FILTERED = TowVolume)

#Rename BottomDepth to BOTTOM_DEPTH to match EcoDAAT

EMA_Combined_Recode <- rename(EMA_Combined_Recode, BOTTOM_DEPTH = BottomDepth)


#Rearrange the file to add a column indicating origin of data, to have them in the same order as the EcoDAAT file and remove non-matched columns prior to merge


EMA_Combined_Recode$DATA_SOURCE <- "EMA"

#Inset columns not present in EMA, but will be in EcoDAAT

EMA_Combined_Recode$DIS_PERVOLM2 <- NA
EMA_Combined_Recode$DIS_PERVOLM3 <- NA
EMA_Combined_Recode$FOCI_ID <- NA
EMA_Combined_Recode$FOCI_SAMPLE_ID <- NA
EMA_Combined_Recode$GEOGRAPHIC_AREA <- NA
EMA_Combined_Recode$HAUL_ID <- NA
EMA_Combined_Recode$HAUL_NAME <- NA
EMA_Combined_Recode$MIN_GEAR_DEPTH <- NA
EMA_Combined_Recode$NET <- NA
EMA_Combined_Recode$SAMPLE_DEPTH <- NA
EMA_Combined_Recode$SEX <- NA
EMA_Combined_Recode$SPECIMEN_FORM <- NA
EMA_Combined_Recode$STAGE <- NA
EMA_Combined_Recode$TAXON_SIZE <- NA
EMA_Combined_Recode$ZOOP_COPEPOD_NAUPLII <- NA
EMA_Combined_Recode$ZOOP_EUPHAUSIID_EGG <- NA


#Create HAUL_ID column information for merging purposes

EMA_Combined_Recode$HAUL_ID <- paste0(EMA_Combined_Recode$CRUISE," ",EMA_Combined_Recode$STATION_NAME," ", 1," ", EMA_Combined_Recode$GEAR_NAME," ", 1)


#Create vector of column names from the EcoDAAT File

EcoDAAT_ColumnNames <- c("BOTTOM_DEPTH", "CRUISE", "DAY", "DIS_PERVOLM2", "DIS_PERVOLM3", "EST_NUM_PERM2", "EST_NUM_PERM3", "FOCI_ID", "FOCI_SAMPLE_ID", "GEAR_NAME", "GEOGRAPHIC_AREA", "GMT_DATE_TIME_TXT", "HAUL_ID", "HAUL_NAME", "HAUL_PERFORMANCE", "LAT", "LON", "MAX_GEAR_DEPTH", "MESH", "MIN_GEAR_DEPTH", "MONTH", "NET", "SAMPLE_DEPTH", "SEX", "SEX_NAME", "SIZE_NAME", "SPECIMEN_FORM", "STAGE", "STAGE_NAME", "STATION_NAME", "TAXON_NAME", "TAXON_SIZE", "VOLUME_FILTERED",  "YEAR", "ZOOP_COPEPOD_NAUPLII", "ZOOP_EUPHAUSIID_EGG", "DATA_SOURCE")

EMA_Combined_Recode <- EMA_Combined_Recode[, EcoDAAT_ColumnNames]

Import EcoDAAT data

Connect to database to import zoop data directly from EcoDAAT

#Create connect to the AFSC database
# 
# user <- readline("Input Username: ")
# pswd <- readline("Input Password: ")
# 
# AFSC_Connect <- odbcConnect("AFSC", uid=user,  pwd=pswd)
# 
# 
# #Delete and refresh table to draw from, in this case it is SPECIMEN_MAIN_GEOM
# 
# sqlQuery(AFSC_Connect,"DROP TABLE SPECIMEN_MAIN_GEOM;")
# 
# sqlQuery(AFSC_Connect,"CREATE TABLE SPECIMEN_MAIN_GEOM AS SELECT * FROM ECODAAT.SPECIMEN_MAIN_GEOM;")


#Run SQL Queries to build zooplankton dataset 
# 
# #Query the database
# 
# zoopdata <- sqlQuery(AFSC_Connect, "SELECT BOTTOM_DEPTH,
# CRUISE, DAY, DIS_PERVOLM2, DIS_PERVOLM3, EST_NUM_PERM2, EST_NUM_PERM3, FOCI_ID, FOCI_SAMPLE_ID, GEAR_NAME, 
# GEOGRAPHIC_AREA, GMT_DATE_TIME_TXT, HAUL_ID, HAUL_NAME, HAUL_PERFORMANCE, LAT, LON, MAX_GEAR_DEPTH, MESH,
# MIN_GEAR_DEPTH, MONTH, NET, SAMPLE_DEPTH, SEX, SEX_NAME, SIZE_NAME, SPECIMEN_FORM, STAGE, STAGE_NAME, STATION_NAME,
# TAXON_NAME, TAXON_SIZE, VOLUME_FILTERED, YEAR, ZOOP_COPEPOD_NAUPLII, ZOOP_EUPHAUSIID_EGG
# FROM SPECIMEN_MAIN_GEOM WHERE ORIG_DB LIKE 'BOB';", stringsAsFactors=FALSE)

#Close database connection
 
# odbcClose(AFSC_Connect)

#Drop one cruise using the old protocol OS17 and replace with correct data
zoopdata <- read_csv(here("data","AllZoopRaw.csv")) %>%
  filter(!CRUISE=="OS17-01") %>%
  dplyr::select(-...1)
New names:
* `` -> ...1
Rows: 825071 Columns: 37
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (15): CRUISE, FOCI_ID, FOCI_SAMPLE_ID, GEAR_NAME, GEOGRAPHIC_AREA, HAUL...
dbl  (21): ...1, BOTTOM_DEPTH, DAY, DIS_PERVOLM2, DIS_PERVOLM3, EST_NUM_PERM...
dttm  (1): GMT_DATE_TIME_TXT

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#Bring in OS17-01
OS1701 <- read.csv(here("data", "Raw-Data", "OS1701_EcoFOCI_ZooplanktonNet.csv"))

zoopdata <- rbind(zoopdata, OS1701)

#Delete OS1701

rm(OS1701)

Do some data tidying for the EcoDAAT data set and combine the EcoDAAT and EMA datasets


#Recode mesh sizes for 150, 333, 500

zoopdata$MESH[zoopdata$MESH==150] <- 153
zoopdata$MESH[zoopdata$MESH==154] <- 153
zoopdata$MESH[zoopdata$MESH==1153] <- 153
zoopdata$MESH[zoopdata$MESH==335] <- 333
zoopdata$MESH[zoopdata$MESH==500] <- 505


#Count number of cruises in the EMA dataset

EMA_Combined_Recode_byCRUISE <- group_by(EMA_Combined_Recode, CRUISE)
EMA_Combined_Recode_CruiseCount <- summarise(EMA_Combined_Recode_byCRUISE, n_distinct(YEAR))

ungroup(EMA_Combined_Recode)

#Count number of cruises in the EMA dataset

zoopdata_byCRUISE <- group_by(zoopdata, CRUISE)
zoopdata_CruiseCount <- summarise(zoopdata_byCRUISE, n_distinct(YEAR))

ungroup(zoopdata)
 

#Do a join to see if cruises have matches in both datasets:

TestData <- semi_join(EMA_Combined_Recode_CruiseCount, zoopdata_CruiseCount, by = "CRUISE")




#10 cruises are present in EMA dataset and zoopdata data set, remove those from the EMA dataset to avoid double counting

EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="1GP99")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="3DY12")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="AE14-01")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="AE15-01")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY14-06")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY14-08")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY15-07")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY15-08")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY16-09")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="NW17-05")

#RemoveFiles

rm(EMA_Combined_Recode_byCRUISE, EMA_Combined_Recode_CruiseCount, zoopdata_byCRUISE, zoopdata_CruiseCount, TestData)

#Combine the EMA and EcoDAAT datasets

#Add Data Source file to the zoopdata prior to combination

zoopdata$DATA_SOURCE <- "EcoDAAT"


#Combine datasets 

AllZoop_Raw <- rbind(EMA_Combined_Recode, zoopdata)



#Create vector of Combined column names to trim dataset for final processing

Combined_ColumnNames <- c("BOTTOM_DEPTH", "CRUISE", "DAY", "DIS_PERVOLM2", "DIS_PERVOLM3", "EST_NUM_PERM2", "EST_NUM_PERM3", "GEAR_NAME", "GMT_DATE_TIME_TXT", "HAUL_ID", "HAUL_PERFORMANCE", "LAT", "LON", "MAX_GEAR_DEPTH", "MESH", "MONTH", "SPECIMEN_FORM", "SEX_NAME", "SIZE_NAME", "STAGE_NAME", "STATION_NAME", "TAXON_NAME", "VOLUME_FILTERED",  "YEAR", "DATA_SOURCE")

#Keep only those columns

AllZoop_Raw <- AllZoop_Raw[,Combined_ColumnNames]

#Remove files

rm (EMA_Combined, EMA_Combined_Recode, zoopdata)

Quick map of the raw data stations

#Quick plot to take a look at the dataset so far

#Get world data from #natural earth package

world <- ne_countries(scale = "medium", returnclass = "sf")
class(world)

# get regional polygons
reg = map_data("world2Hires")
reg = subset(reg, region %in% c('USSR', 'USA'))

# convert lat longs
reg$long = (360 - reg$long)*-1

# set map limits
lons = c(-179.5, -130)
lats = c(50, 74)


######################################
# 
# # make plot
# Region_Map_RawData <- ggplot()+
# 
#   # add coastline
#   geom_sf(data = world)+
#     coord_sf(xlim = lons, ylim = lats, expand = FALSE)+
# 
#   #Plot station points
#   geom_point(data=AllZoop_Raw, mapping=aes(LON, LAT))+
# 
#   # formatting
#   theme_bw()+
#   xlab("Longitude")+
#   ylab("Latitude")
# 
# Region_Map_RawData

Data Filtering for BP Synthesis Project


#First filter for all data north of 60N
       
#
NBS_Zoop <- filter(AllZoop_Raw, LAT>=55)


#Now map again to take a look
# 
# # make plot
# Region_Map_NBS_Process_1 <- ggplot()+
# 
#   # add coastline
#   geom_sf(data = world)+
#     coord_sf(xlim = lons, ylim = lats, expand = FALSE)+
# 
#   #Plot station points
#   geom_point(data=NBS_Zoop, mapping=aes(LON, LAT))+
# 
#   # formatting
#   theme_bw()+
#   xlab("Longitude")+
#   ylab("Latitude")
# 
# Region_Map_NBS_Process_1
# 
# 
# #Looks like some data from the GOA is still present, so remove data > 155

#
NBS_Zoop <- filter(NBS_Zoop, LON<= -150)

#Now map again to take a look
# 
# # make plot
# Region_Map_NBS_Process_2 <- ggplot()+
# 
#   # add coastline
#   geom_sf(data = world)+
#     coord_sf(xlim = lons, ylim = lats, expand = FALSE)+
# 
#   #Plot station points
#   geom_point(data=NBS_Zoop, mapping=aes(LON, LAT))+
# 
#   # formatting
#   theme_bw()+
#   xlab("Longitude")+
#   ylab("Latitude")
# 
# Region_Map_NBS_Process_2
# 
# #Spatial coverage looks correct

#Now check temporal coverage

sort(unique(NBS_Zoop$YEAR), decreasing = FALSE)
 [1] 1987 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002
[16] 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017
[31] 2018 2019
#Remove data from 1996 as it is removed from all other years of collection

NBS_Zoop <- filter(NBS_Zoop, YEAR!=1996)

#Take a look at the gears present in the dataset

unique(NBS_Zoop$GEAR_NAME)
 [1] "60BON"    "Juday"    "PairoVET" "80BON"    "20BON"    "TUCK1"   
 [7] "SLED"     "LG-CB"    "V60BON"   "MBT"      "MOC1"     "CALVET"  
[13] "CTDB"     "METH"     "QUADNET"  "IKMT"    
unique(NBS_Zoop$MESH)
 [1] "505"  "333"  "168"  "153"  "3000" "1000" "53"   NA     "0"    "1500"
[11] "6000"
#Rough estimate of number of samples by gear type

NBS_Zoop_Gear <- NBS_Zoop[, c("CRUISE", "GEAR_NAME", "MESH", "LAT", "LON")]

NBS_Zoop_Gear <- distinct(NBS_Zoop_Gear)

NBS_Zoop_Gear_byGear <- group_by(NBS_Zoop_Gear, GEAR_NAME, MESH)

NBS_Gear_Summary <- summarise(NBS_Zoop_Gear_byGear, n())
`summarise()` has grouped output by 'GEAR_NAME'. You can override using the
`.groups` argument.
ungroup(NBS_Zoop_Gear)

#This shows a few gears can be eliminated for low sample size (V60BON, 80BON) and CALVET has too small mesh size

NBS_Zoop <- filter(NBS_Zoop, GEAR_NAME!="CALVET")
NBS_Zoop <- filter(NBS_Zoop, GEAR_NAME!="V60BON")
NBS_Zoop <- filter(NBS_Zoop, GEAR_NAME!="80BON")

#Remove sled data as this is biased toward a bottom sample

NBS_Zoop <- filter(NBS_Zoop, GEAR_NAME!="SLED")



#Remove failed and questionable hauls

#First save the NA since EMA data does not always record HAUL_PERFORMANCE

HaulPerf_NA <- NBS_Zoop[is.na(NBS_Zoop$HAUL_PERFORMANCE),]

NBS_Zoop_GOOD <- filter(NBS_Zoop, HAUL_PERFORMANCE=="GOOD")

#Rebuild dataset without QUEST and FAIL HAULS

NBS_Zoop <- rbind(HaulPerf_NA, NBS_Zoop_GOOD)



#Write this raw file prior to further processing

write.csv(NBS_Zoop, here("data", "Raw-Data", "NBS_Zoop_Raw.csv"))

Bring in the Coarse Taxa List to aid in lumping and filter out some taxa


TaxaList_Coarse <- read.csv(here("data", "Taxa-Lists", "TaxaList_Coarse.csv"))

#Now add this to the file

TaxaList_Coarse <- distinct(TaxaList_Coarse)

NBS_Zoop_Process <- left_join(NBS_Zoop, TaxaList_Coarse, by = "TAXON_NAME")

#Filter out those data marked for removal

NBS_Zoop_Process <- filter(NBS_Zoop_Process, NOTE != "Remove")

Create taxa specific data sets to select the correct stages from the correct GEAR_NAME and MESH for each specific coarse taxa

Acartia spp


Acartia_spp <- filter(NBS_Zoop_Process, TAXA_COARSE=="Acartia spp.")

#Acartia is a small copepod, so all estimates should come from the smaller nets

#Filter for correct gear

Acartia_spp <- filter(Acartia_spp, GEAR_NAME!= "60BON")


#Being to build final data set


NBS_Zoop_Process_Final <- Acartia_spp

Aglantha digitale


Aglantha_digitale <- filter(NBS_Zoop_Process, TAXA_COARSE=="Aglantha digitale")

#Choose to estimate Cnidarians from the 60BON only

Aglantha_digitale <- filter(Aglantha_digitale, GEAR_NAME=="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Aglantha_digitale)

Amphipods


Amphipoda <- filter(NBS_Zoop_Process, TAXA_COARSE=="Amphipoda")

#Amhipods will be estimated from the 60BON only

Amphipoda <- filter(Amphipoda, GEAR_NAME=="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Amphipoda)

Anomura


Anomura <- filter(NBS_Zoop_Process, TAXA_COARSE=="Anomura")

#Anomura estimate from 60BON only

Anomura <- filter(Amphipoda, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Anomura)

Appendicularia


Appendicularia <- filter(NBS_Zoop_Process, TAXA_COARSE=="Appendicularia")

#Can filter for both gears and then add a taxa coarse of Appendicularia_large and Appendicular_small

Appendicularia_large <- filter(Appendicularia, GEAR_NAME=="60BON")

#Recode coarse taxa

Appendicularia_large$TAXA_COARSE[Appendicularia_large$TAXA_COARSE=="Appendicularia"] <- "Appendicularia_large"


Appendicularia_small <- filter(Appendicularia, GEAR_NAME!="60BON")

#Recode coarse taxa

Appendicularia_small$TAXA_COARSE[Appendicularia_small$TAXA_COARSE=="Appendicularia"] <- "Appendicularia_small"


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Appendicularia_large, Appendicularia_small)

Bivalvia


Bivalvia <- filter(NBS_Zoop_Process, TAXA_COARSE=="Bivalvia")

#Bivalvia estimate from smaller nets only

Bivalvia <- filter(Bivalvia, GEAR_NAME!="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Bivalvia)

Brachyura


Brachyura <- filter(NBS_Zoop_Process, TAXA_COARSE=="Brachyura")

#Brachyura estimate from 60BON only

Brachyura <- filter(Brachyura, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Brachyura)

Calanus hyperboreus


Calanus_hyperboreus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Calanus hyperboreus")


#Separate EMA data as they were sorted under different protocols

Calanus_hyperboreus_EMA <- filter(Calanus_hyperboreus, DATA_SOURCE=="EMA")
Calanus_hyperboreus_EcoDAAT <- filter(Calanus_hyperboreus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Calanus_hyperboreus_EcoDAAT_bySPECIMEN_FORM <- group_by(Calanus_hyperboreus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Calanus_hyperboreus_EcoDAAT_FormSummary <- summarise(Calanus_hyperboreus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override
using the `.groups` argument.
#These look correct

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Calanus_hyperboreus_EMA_byGEAR_NAME <- group_by(Calanus_hyperboreus_EMA, MESH, GEAR_NAME)

Calanus_hyperboreus_EMA_GearSummary <- summarise(Calanus_hyperboreus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the
`.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Calanus_hyperboreus_EMA <- filter(Calanus_hyperboreus_EMA, MESH != 153)


#The other gears are correct, so rebuild dataset

Calanus_hyperboreus <- rbind(Calanus_hyperboreus_EcoDAAT, Calanus_hyperboreus_EMA)


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Calanus_hyperboreus)

Calanus marshallae/glacialis


Calanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Calanus marshallae/glacialis")

#Separate EMA data as they were sorted under different protocols

Calanus_EMA <- filter(Calanus, DATA_SOURCE=="EMA")
Calanus_EcoDAAT <- filter(Calanus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Calanus_EcoDAAT_bySPECIMEN_FORM <- group_by(Calanus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Calanus_EcoDAAT_FormSummary <- summarise(Calanus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override
using the `.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Calanus_EcoDAAT_B <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="B")
Calanus_EcoDAAT_B <- filter(Calanus_EcoDAAT_B, MESH!=153)

Calanus_EcoDAAT_C <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="C")
Calanus_EcoDAAT_C <- filter(Calanus_EcoDAAT_C, MESH==153)
Calanus_EcoDAAT_C <- filter(Calanus_EcoDAAT_C, GEAR_NAME=="20BON")

Calanus_EcoDAAT_G <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="G")

Calanus_EcoDAAT_H <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="H")

Calanus_EcoDAAT_K <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="K")

Calanus_EcoDAAT_L <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Calanus_EcoDAAT_Final <- rbind(Calanus_EcoDAAT_B, Calanus_EcoDAAT_C, Calanus_EcoDAAT_G, Calanus_EcoDAAT_H, Calanus_EcoDAAT_K, Calanus_EcoDAAT_L)

ungroup(Calanus_EcoDAAT_Final)

#Remove some files

rm(Calanus_EcoDAAT_bySPECIMEN_FORM, Calanus_EcoDAAT_B, Calanus_EcoDAAT_C, Calanus_EcoDAAT_G, Calanus_EcoDAAT_H, Calanus_EcoDAAT_K, Calanus_EcoDAAT_L)

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Calanus_EMA_byGEAR_NAME <- group_by(Calanus_EMA, MESH, GEAR_NAME)

Calanus_EMA_GearSummary <- summarise(Calanus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the
`.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Calanus_EMA_60BON <- filter(Calanus_EMA, GEAR_NAME=="60BON")

Calanus_EMA_60BON_333 <- filter(Calanus_EMA_60BON, MESH==333)

Calanus_EMA_60BON_333 <- filter(Calanus_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

Calanus_EMA_60BON_505 <- filter(Calanus_EMA_60BON, MESH==505)

Calanus_EMA_60BON_505 <- filter(Calanus_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)")

Calanus_EMA_20BON <- filter(Calanus_EMA, GEAR_NAME=="20BON")

Calanus_EMA_20BON_153 <- filter(Calanus_EMA_20BON, MESH==153)

Calanus_EMA_20BON_153 <- filter(Calanus_EMA_20BON_153, STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 1 (COPEPODITE I)")

#The other gears are correct, so rebuild dataset

Calanus_EMA_Final <- rbind(Calanus_EMA_60BON_333, Calanus_EMA_60BON_505, Calanus_EMA_20BON_153)

ungroup(Calanus_EMA_Final)

#Remove some files

rm(Calanus_EMA_byGEAR_NAME, Calanus_EMA_20BON, Calanus_EMA_20BON_153, Calanus_EMA_60BON, Calanus_EMA_60BON_333, Calanus_EMA_60BON_505)

#Combine into final, Calanus data set

Calanus <- rbind(Calanus_EMA_Final, Calanus_EcoDAAT_Final)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Calanus)

Calanus pacificus


Calanus_pacificus <- filter(NBS_Zoop_Process, TAXA_COARSE == "Calanus pacificus")


#Separate EMA data as they were sorted under different protocols

Calanus_pacificus_EMA <- filter(Calanus_pacificus, DATA_SOURCE=="EMA")
Calanus_pacificus_EcoDAAT <- filter(Calanus_pacificus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Calanus_pacificus_EcoDAAT_bySPECIMEN_FORM <- group_by(Calanus_pacificus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Calanus_pacificus_EcoDAAT_FormSummary <- summarise(Calanus_pacificus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override
using the `.groups` argument.
#Stages and gear are correct for EcoDAAT data


#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Calanus_pacificus_EMA_byGEAR_NAME <- group_by(Calanus_pacificus_EMA, MESH, GEAR_NAME)

Calanus_pacificus_EMA_GearSummary <- summarise(Calanus_pacificus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the
`.groups` argument.
# Need to filter for the correct stages for avoid double counts, just remove one Juday sample

Calanus_pacificus_EMA <- filter(Calanus_pacificus_EMA, GEAR_NAME!="Juday")



#Combine into final, Calanus_pacificus data set

Calanus_pacificus <- rbind(Calanus_pacificus_EMA, Calanus_pacificus_EcoDAAT)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Calanus_pacificus)

Caridea


Caridea <- filter(NBS_Zoop_Process, TAXA_COARSE == "Caridea")

#Caridea estimate from larger nets only

Caridea <- filter(Caridea, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Caridea)

Centropages abdominalis


Centropages <- filter(NBS_Zoop_Process, TAXA_COARSE=="Centropages abdominalis")


#Separate EMA data as they were sorted under different protocols

Centropages_EMA <- filter(Centropages, DATA_SOURCE=="EMA")
Centropages_EcoDAAT <- filter(Centropages, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Centropages_EcoDAAT_bySPECIMEN_FORM <- group_by(Centropages_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Centropages_EcoDAAT_FormSummary <- summarise(Centropages_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override
using the `.groups` argument.
#Filter for correct GEAR_NAME and MESH from EcoDAAT

Centropages_EcoDAAT <- filter(Centropages_EcoDAAT, SPECIMEN_FORM!="G")


#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Centropages_EMA_byGEAR_NAME <- group_by(Centropages_EMA, MESH, GEAR_NAME)

Centropages_EMA_GearSummary <- summarise(Centropages_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the
`.groups` argument.
#For consistency, select the smaller gear only

Centropages_EMA <- filter(Centropages_EMA, GEAR_NAME!="60BON")


#Recombined data

Centropages <- rbind(Centropages_EcoDAAT, Centropages_EMA)



#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Centropages)

Chaetognatha


Chaetognatha <- filter(NBS_Zoop_Process, TAXA_COARSE=="Chaetognatha")

#Filter for Chaetognatha from the 60BON nets only

Chaetognatha <- filter(Chaetognatha, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Chaetognatha)

Cirripedia


Cirripedia <- filter(NBS_Zoop_Process, TAXA_COARSE == "Cirripedia")

#Can filter for both gears and then add a taxa coarse of Cirripedia_large and Cirripedia_small

Cirripedia_large <- filter(Cirripedia, GEAR_NAME=="60BON")

#Recode coarse taxa

Cirripedia_large$TAXA_COARSE[Cirripedia_large$TAXA_COARSE=="Cirripedia"] <- "Cirripedia_large"


Cirripedia_small <- filter(Cirripedia, GEAR_NAME!="60BON")

#Recode coarse taxa

Cirripedia_small$TAXA_COARSE[Cirripedia_small$TAXA_COARSE=="Cirripedia"] <- "Cirripedia_small"

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cirripedia_large, Cirripedia_small)

Cladocera


Cladocera <- filter(NBS_Zoop_Process, TAXA_COARSE=="Cladocera")

#Cladocera fromt he small net only

#Filter for correct gear

Cladocera <- filter(Cladocera, GEAR_NAME!= "60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cladocera)

Clione limacina


Clione <- filter(NBS_Zoop_Process, TAXA_COARSE=="Clione limacina")

#Estimate from the larger net only

Clione <- filter(Clione, GEAR_NAME=="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Clione)

Cnidaria


Cnidaria <- filter(NBS_Zoop_Process, TAXA_COARSE == "Cnidaria")

#Can filter for both gears and then add a taxa coarse of Cnidaria_large and Cnidaria_small

Cnidaria_large <- filter(Cnidaria, GEAR_NAME=="60BON")

#Recode coarse taxa

Cnidaria_large$TAXA_COARSE[Cnidaria_large$TAXA_COARSE=="Cnidaria"] <- "Cnidaria_large"


Cnidaria_small <- filter(Cnidaria, GEAR_NAME!="60BON")

#Recode coarse taxa

Cnidaria_small$TAXA_COARSE[Cnidaria_small$TAXA_COARSE=="Cnidaria"] <- "Cnidaria_small"


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cnidaria_large, Cnidaria_small)

Small and large copepods that do not belong to major taxonomic group



Copepod_small <- filter(NBS_Zoop_Process, TAXA_COARSE == "Copepod_small")

#Filter for the smaller mesh gears only

Copepod_small <- filter(Copepod_small, GEAR_NAME!="60BON")

#Now build the large dataset

Copepod_large <- filter(NBS_Zoop_Process, TAXA_COARSE == "Copepod_large")

#Filter for the smaller mesh gears only

Copepod_large <- filter(Copepod_large, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Copepod_large, Copepod_small)

Ctenophora


Ctenophora <- filter(NBS_Zoop_Process, TAXA_COARSE=="Ctenophora")

#Filter for the large net only

Ctenophora <- filter(Ctenophora, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Ctenophora)

Cumacea


Cumacea <- filter(NBS_Zoop_Process, TAXA_COARSE=="Cumacea")

#Filter for the large net only

Cumacea <- filter(Cumacea, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cumacea)

Decapoda


Decapoda <- filter(NBS_Zoop_Process, TAXA_COARSE=="Decapoda")

#Very few measurements of unidentfied decapods. We can ignore

Echinodermata


Echinodermata <- filter(NBS_Zoop_Process, TAXA_COARSE=="Echinodermata")

#Echinodermata are tiny, filter from small nets only

Echinodermata <- filter(Echinodermata, GEAR_NAME!="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Echinodermata)

Epilabidocera longipedata


Epilabidocera <- filter(NBS_Zoop_Process, TAXA_COARSE=="Epilabidocera longipedata")


#Separate EMA data as they were sorted under different protocols

Epilabidocera_EMA <- filter(Epilabidocera, DATA_SOURCE=="EMA")
Epilabidocera_EcoDAAT <- filter(Epilabidocera, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Epilabidocera_EcoDAAT_bySPECIMEN_FORM <- group_by(Epilabidocera_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Epilabidocera_EcoDAAT_FormSummary <- summarise(Epilabidocera_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override
using the `.groups` argument.
#Things are correct for the EcoDAAT data, not look at the EMA data


#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Epilabidocera_EMA_byGEAR_NAME <- group_by(Epilabidocera_EMA, MESH, GEAR_NAME)

Epilabidocera_EMA_GearSummary <- summarise(Epilabidocera_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the
`.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Epilabidocera_EMA_60BON <- filter(Epilabidocera_EMA, GEAR_NAME=="60BON")

Epilabidocera_EMA_60BON_333 <- filter(Epilabidocera_EMA_60BON, MESH==333)

Epilabidocera_EMA_60BON_333 <- filter(Epilabidocera_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

Epilabidocera_EMA_60BON_505 <- filter(Epilabidocera_EMA_60BON, MESH==505)

Epilabidocera_EMA_60BON_505 <- filter(Epilabidocera_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)")

Epilabidocera_EMA_20BON <- filter(Epilabidocera_EMA, GEAR_NAME=="20BON")

Epilabidocera_EMA_20BON_153 <- filter(Epilabidocera_EMA_20BON, MESH==153)

Epilabidocera_EMA_20BON_153 <- filter(Epilabidocera_EMA_20BON_153, STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 1 (COPEPODITE I)")

#The other gears are correct, so rebuild dataset

Epilabidocera_EMA_Final <- rbind(Epilabidocera_EMA_60BON_333, Epilabidocera_EMA_60BON_505, Epilabidocera_EMA_20BON_153)

ungroup(Epilabidocera_EMA_Final)

#Remove some files

rm(Epilabidocera_EMA_byGEAR_NAME, Epilabidocera_EMA_20BON, Epilabidocera_EMA_20BON_153, Epilabidocera_EMA_60BON, Epilabidocera_EMA_60BON_333, Epilabidocera_EMA_60BON_505)

#Combine into final, Epilabidocera data set

Epilabidocera <- rbind(Epilabidocera_EMA_Final, Epilabidocera_EcoDAAT)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Epilabidocera)

Eucalanus bungii


Eucalanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Eucalanus bungii")


#Separate EMA data as they were sorted under different protocols

Eucalanus_EMA <- filter(Eucalanus, DATA_SOURCE=="EMA")
Eucalanus_EcoDAAT <- filter(Eucalanus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Eucalanus_EcoDAAT_bySPECIMEN_FORM <- group_by(Eucalanus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Eucalanus_EcoDAAT_FormSummary <- summarise(Eucalanus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override
using the `.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Eucalanus_EcoDAAT_A <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="A")
Eucalanus_EcoDAAT_A <- filter(Eucalanus_EcoDAAT_A, MESH!=153)

Eucalanus_EcoDAAT_B <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="B")
Eucalanus_EcoDAAT_B <- filter(Eucalanus_EcoDAAT_B, MESH!=153)

Eucalanus_EcoDAAT_C <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="C")
Eucalanus_EcoDAAT_C <- filter(Eucalanus_EcoDAAT_C, MESH==153)

Eucalanus_EcoDAAT_F <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="F")


Eucalanus_EcoDAAT_G <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="G")

Eucalanus_EcoDAAT_H <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="H")

Eucalanus_EcoDAAT_K <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="K")

Eucalanus_EcoDAAT_L <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Eucalanus_EcoDAAT_Final <- rbind(Eucalanus_EcoDAAT_A, Eucalanus_EcoDAAT_B, Eucalanus_EcoDAAT_C, Eucalanus_EcoDAAT_F,  Eucalanus_EcoDAAT_G, Eucalanus_EcoDAAT_H, Eucalanus_EcoDAAT_K, Eucalanus_EcoDAAT_L)

ungroup(Eucalanus_EcoDAAT_Final)

#Remove some files

rm(Eucalanus_EcoDAAT_bySPECIMEN_FORM, Eucalanus_EcoDAAT_A, Eucalanus_EcoDAAT_B, Eucalanus_EcoDAAT_C, Eucalanus_EcoDAAT_F, Eucalanus_EcoDAAT_G, Eucalanus_EcoDAAT_H, Eucalanus_EcoDAAT_K, Eucalanus_EcoDAAT_L)



#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Eucalanus_EMA_byGEAR_NAME <- group_by(Eucalanus_EMA, MESH, GEAR_NAME)

Eucalanus_EMA_GearSummary <- summarise(Eucalanus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the
`.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Eucalanus_EMA_60BON <- filter(Eucalanus_EMA, GEAR_NAME=="60BON")

Eucalanus_EMA_60BON_333 <- filter(Eucalanus_EMA_60BON, MESH==333)

Eucalanus_EMA_60BON_333 <- filter(Eucalanus_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

Eucalanus_EMA_60BON_505 <- filter(Eucalanus_EMA_60BON, MESH==505)

Eucalanus_EMA_60BON_505 <- filter(Eucalanus_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

Eucalanus_EMA_20BON <- filter(Eucalanus_EMA, GEAR_NAME=="20BON")

Eucalanus_EMA_20BON_153 <- filter(Eucalanus_EMA_20BON, MESH==153)

Eucalanus_EMA_20BON_153 <- filter(Eucalanus_EMA_20BON_153, STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 1 (COPEPODITE I)")

#The other gears are correct, so rebuild dataset

Eucalanus_EMA_Final <- rbind(Eucalanus_EMA_60BON_333, Eucalanus_EMA_60BON_505, Eucalanus_EMA_20BON_153)

ungroup(Eucalanus_EMA_Final)

#Remove some files

rm(Eucalanus_EMA_byGEAR_NAME, Eucalanus_EMA_20BON, Eucalanus_EMA_20BON_153, Eucalanus_EMA_60BON, Eucalanus_EMA_60BON_333, Eucalanus_EMA_60BON_505)

#Combine into final, Eucalanus data set

Eucalanus <- rbind(Eucalanus_EMA_Final, Eucalanus_EcoDAAT_Final)


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Eucalanus)

Euphausiacea pacifica


E_pacifica <- filter(NBS_Zoop_Process, TAXA_COARSE=="Euphausia pacifica")

#Filter for large net only and stages are adult and juvenile

E_pacifica <- filter(E_pacifica, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, E_pacifica)

Euphausiacea


Euphausiacea <- filter(NBS_Zoop_Process, TAXA_COARSE=="Euphausiacea")

#First separate out the adults belonging to Tessarbranchion oculatum

    
Tessarabrachion_oculatum <- filter (Euphausiacea, TAXON_NAME=="Tessarabrachion oculatum")


#Now filter the Euphausiacea for the correct stages and nets

Euphausiacea <- filter(Euphausiacea, TAXON_NAME!="Tessarabrachion oculatum")

#Eliminate adult and juvenile stages, those should be identified to species

Euphausiacea <- filter(Euphausiacea, STAGE_NAME!= "A + J (ADULT/JUVENILE)")

Euphausiacea <- filter(Euphausiacea, STAGE_NAME!= "JUVENILE")

#Get rid of the NOT DETERMINED

Euphausiacea <- filter(Euphausiacea, STAGE_NAME!="NOT DETERMINED")

#Get rid of the EGG

Euphausiacea <- filter(Euphausiacea, STAGE_NAME!="EGG")


#Now create the furcilia dataset

Euphausiacea_furcilia <- filter(Euphausiacea, STAGE_NAME=="FURCILIA")

Euphausiacea_furcilia <- filter(Euphausiacea, GEAR_NAME=="60BON")


#Now create the calytopis dataset

Euphausiacea_calyptopis <- filter(Euphausiacea, STAGE_NAME=="CALYPTOPIS (STAGE NOT DETERMINED)"|STAGE_NAME=="CALYPTOPIS 1"|STAGE_NAME=="CALYPTOPIS 2"|STAGE_NAME=="CALYPTOPIS 3")


#Now create the nauplius dataset

Euphausiacea_nauplius <- filter(Euphausiacea, STAGE_NAME=="NAUPLIUS")

#Filter for small nets only

Euphausiacea_nauplius <- filter(Euphausiacea_nauplius, GEAR_NAME!="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Euphausiacea_furcilia, Euphausiacea_calyptopis, Euphausiacea_nauplius)

Eurytemora spp.


Eurytemora <- filter(NBS_Zoop_Process, TAXA_COARSE=="Eurytemora spp.")

#Filter from the small nets only

Eurytemora <- filter(Eurytemora, GEAR_NAME!="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Eurytemora)

Gastropoda


Gastropoda <- filter(NBS_Zoop_Process, TAXA_COARSE=="Gastropoda")

#Unidentified gastropods, can remove from final dataset

Limacina helicina


Limacina <- filter(NBS_Zoop_Process, TAXA_COARSE=="Limacina helicina")

#Can split into estiamtes from large and small nets


Limacina_large <- filter(Limacina, GEAR_NAME=="60BON")

#Rename the coarse taxa

Limacina_large$TAXA_COARSE[Limacina_large$TAXA_COARSE=="Limacina helicina"] <- "Limacina_large"

#Now do the small nets

Limacina_small <- filter(Limacina, GEAR_NAME!="60BON")

#Rename the coarse taxa

Limacina_small$TAXA_COARSE[Limacina_small$TAXA_COARSE=="Limacina helicina"] <- "Limacina_small"


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Limacina_large, Limacina_small)

Metridia longa


Metridia_longa <- filter(NBS_Zoop_Process, TAXA_COARSE=="Metridia longa")

#Adults, C5 only so all is good, can add to full data set

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Metridia_longa)

Metridia okhotensis


Metridia_okhotensis <- filter(NBS_Zoop_Process, TAXA_COARSE=="Metridia okhotensis")


#Adults, C4, and C5 only so all is good, can add to full data set

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Metridia_okhotensis)

Metridia pacifica


Metridia_pacifica <- filter(NBS_Zoop_Process, TAXA_COARSE=="Metridia pacifica")


#Separate EMA data as they were sorted under different protocols

Metridia_pacifica_EMA <- filter(Metridia_pacifica, DATA_SOURCE=="EMA")
Metridia_pacifica_EcoDAAT <- filter(Metridia_pacifica, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Metridia_pacifica_EcoDAAT_bySPECIMEN_FORM <- group_by(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Metridia_pacifica_EcoDAAT_FormSummary <- summarise(Metridia_pacifica_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override
using the `.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Metridia_pacifica_EcoDAAT_B <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="B")
Metridia_pacifica_EcoDAAT_B <- filter(Metridia_pacifica_EcoDAAT_B, MESH!=153)

Metridia_pacifica_EcoDAAT_C <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="C")

Metridia_pacifica_EcoDAAT_G <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="G")


Metridia_pacifica_EcoDAAT_H <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="H")

#Remove C3 stage

Metridia_pacifica_EcoDAAT_H <- filter(Metridia_pacifica_EcoDAAT_H, STAGE_NAME!="C - 3 (COPEPODITE III)")


Metridia_pacifica_EcoDAAT_K <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="K")

Metridia_pacifica_EcoDAAT_L <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Metridia_pacifica_EcoDAAT_Final <- rbind(Metridia_pacifica_EcoDAAT_B, Metridia_pacifica_EcoDAAT_C, Metridia_pacifica_EcoDAAT_G, Metridia_pacifica_EcoDAAT_H, Metridia_pacifica_EcoDAAT_K, Metridia_pacifica_EcoDAAT_L)

ungroup(Metridia_pacifica_EcoDAAT_Final)

#Remove some files

rm(Metridia_pacifica_EcoDAAT_bySPECIMEN_FORM, Metridia_pacifica_EcoDAAT_B, Metridia_pacifica_EcoDAAT_C, Metridia_pacifica_EcoDAAT_G, Metridia_pacifica_EcoDAAT_H, Metridia_pacifica_EcoDAAT_K, Metridia_pacifica_EcoDAAT_L)

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Metridia_pacifica_EMA_byGEAR_NAME <- group_by(Metridia_pacifica_EMA, MESH, GEAR_NAME)

Metridia_pacifica_EMA_GearSummary <- summarise(Metridia_pacifica_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the
`.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Metridia_pacifica_EMA_60BON <- filter(Metridia_pacifica_EMA, GEAR_NAME=="60BON")

Metridia_pacifica_EMA_60BON_333 <- filter(Metridia_pacifica_EMA_60BON, MESH==333)

Metridia_pacifica_EMA_60BON_333 <- filter(Metridia_pacifica_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)")

Metridia_pacifica_EMA_60BON_505 <- filter(Metridia_pacifica_EMA_60BON, MESH==505)

Metridia_pacifica_EMA_60BON_505 <- filter(Metridia_pacifica_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)")



Metridia_pacifica_EMA_smallnets <- filter(Metridia_pacifica_EMA, GEAR_NAME!="60BON")

Metridia_pacifica_EMA_smallnets <- filter(Metridia_pacifica_EMA_smallnets, STAGE_NAME=="C - 1 (COPEPODITE I)"|STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

#Rename Metridia pacific of early stages as Metridia spp.

Metridia_pacifica_EMA_smallnets$TAXA_COARSE[Metridia_pacifica_EMA_smallnets$TAXA_COARSE=="Metridia pacifica"] <- "Metridia spp."

#The other gears are correct, so rebuild dataset

Metridia_pacifica_EMA_Final <- rbind(Metridia_pacifica_EMA_60BON_333, Metridia_pacifica_EMA_60BON_505, Metridia_pacifica_EMA_smallnets)

ungroup(Metridia_pacifica_EMA_Final)

#Remove some files

rm(Metridia_pacifica_EMA_byGEAR_NAME, Metridia_pacifica_EMA_smallnets, Metridia_pacifica_EMA_60BON, Metridia_pacifica_EMA_60BON_333, Metridia_pacifica_EMA_60BON_505)

#Combine into final, Metridia_pacifica data set

Metridia_pacifica <- rbind(Metridia_pacifica_EMA_Final, Metridia_pacifica_EcoDAAT_Final)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Metridia_pacifica)

Metridia spp.


Metridia_spp <- filter(NBS_Zoop_Process, TAXA_COARSE=="Metridia spp.")

#Filter for the small nets only

Metridia_spp <- filter(Metridia_spp, GEAR_NAME!="60BON")

#Now filter out the stages that are accurate for the small nets, anything less than stage C-3

Metridia_spp <- filter(Metridia_spp, STAGE_NAME!= "C-1 TO C-5")
Metridia_spp <- filter(Metridia_spp, STAGE_NAME!= "C3-4")
Metridia_spp <- filter(Metridia_spp, STAGE_NAME!= "C3-5")
Metridia_spp <- filter(Metridia_spp, STAGE_NAME!= "C - 4 (COPEPODITE IV)")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Metridia_spp)

Mysids


Mysidae <- filter(NBS_Zoop_Process, TAXA_COARSE=="Mysidae")

#Filter for 60BON nets only

Mysidae <- filter(Mysidae, GEAR_NAME=="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Mysidae)

Neocalanus cristatus


Cristatus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Neocalanus cristatus")


#Separate EMA data as they were sorted under different protocols

Cristatus_EMA <- filter(Cristatus, DATA_SOURCE=="EMA")
Cristatus_EcoDAAT <- filter(Cristatus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Cristatus_EcoDAAT_bySPECIMEN_FORM <- group_by(Cristatus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Cristatus_EcoDAAT_FormSummary <- summarise(Cristatus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override
using the `.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Cristatus_EcoDAAT_A <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="A")
Cristatus_EcoDAAT_A <- filter(Cristatus_EcoDAAT_A, MESH!=153)

Cristatus_EcoDAAT_B <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="B")
Cristatus_EcoDAAT_B <- filter(Cristatus_EcoDAAT_B, MESH!=153)

Cristatus_EcoDAAT_C <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="C")
Cristatus_EcoDAAT_C <- filter(Cristatus_EcoDAAT_C, MESH==153)
Cristatus_EcoDAAT_C <- filter(Cristatus_EcoDAAT_C, GEAR_NAME=="20BON")

Cristatus_EcoDAAT_F <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="F")

Cristatus_EcoDAAT_G <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="G")

Cristatus_EcoDAAT_H <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="H")

Cristatus_EcoDAAT_K <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="K")

Cristatus_EcoDAAT_L <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Cristatus_EcoDAAT_Final <- rbind(Cristatus_EcoDAAT_A, Cristatus_EcoDAAT_B, Cristatus_EcoDAAT_C, Cristatus_EcoDAAT_F, Cristatus_EcoDAAT_G, Cristatus_EcoDAAT_H, Cristatus_EcoDAAT_K, Cristatus_EcoDAAT_L)

ungroup(Cristatus_EcoDAAT_Final)

#Remove some files

rm(Cristatus_EcoDAAT_bySPECIMEN_FORM, Cristatus_EcoDAAT_A, Cristatus_EcoDAAT_B, Cristatus_EcoDAAT_C, Cristatus_EcoDAAT_F, Cristatus_EcoDAAT_G, Cristatus_EcoDAAT_H, Cristatus_EcoDAAT_K, Cristatus_EcoDAAT_L)

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Cristatus_EMA_byGEAR_NAME <- group_by(Cristatus_EMA, MESH, GEAR_NAME)

Cristatus_EMA_GearSummary <- summarise(Cristatus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the
`.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Cristatus_EMA_Final <-  filter(Cristatus_EMA, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")


ungroup(Cristatus_EMA_Final)


#Now combine EMA and EcoDAAT data together

Cristatus_Final <- rbind(Cristatus_EMA_Final, Cristatus_EcoDAAT_Final)


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cristatus_Final)

Neocalanus spp.


Neocalanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Neocalanus spp.")


#Separate EMA data as they were sorted under different protocols

Neocalanus_EMA <- filter(Neocalanus, DATA_SOURCE=="EMA")
Neocalanus_EcoDAAT <- filter(Neocalanus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Neocalanus_EcoDAAT_bySPECIMEN_FORM <- group_by(Neocalanus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Neocalanus_EcoDAAT_FormSummary <- summarise(Neocalanus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override
using the `.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Neocalanus_EcoDAAT_B <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="B")
Neocalanus_EcoDAAT_B <- filter(Neocalanus_EcoDAAT_B, MESH!=153)

Neocalanus_EcoDAAT_C <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="C")
Neocalanus_EcoDAAT_C <- filter(Neocalanus_EcoDAAT_C, MESH==153)
Neocalanus_EcoDAAT_C <- filter(Neocalanus_EcoDAAT_C, GEAR_NAME=="20BON")

Neocalanus_EcoDAAT_G <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="G")

Neocalanus_EcoDAAT_H <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="H")

Neocalanus_EcoDAAT_K <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="K")

Neocalanus_EcoDAAT_L <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Neocalanus_EcoDAAT_Final <- rbind(Neocalanus_EcoDAAT_B, Neocalanus_EcoDAAT_C, Neocalanus_EcoDAAT_G, Neocalanus_EcoDAAT_H, Neocalanus_EcoDAAT_K, Neocalanus_EcoDAAT_L)

ungroup(Neocalanus_EcoDAAT_Final)

#Remove some files

rm(Neocalanus_EcoDAAT_bySPECIMEN_FORM, Neocalanus_EcoDAAT_B, Neocalanus_EcoDAAT_C, Neocalanus_EcoDAAT_G, Neocalanus_EcoDAAT_H, Neocalanus_EcoDAAT_K, Neocalanus_EcoDAAT_L)

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Neocalanus_EMA_byGEAR_NAME <- group_by(Neocalanus_EMA, MESH, GEAR_NAME)

Neocalanus_EMA_GearSummary <- summarise(Neocalanus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the
`.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Neocalanus_EMA_Final <-  filter(Neocalanus_EMA, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")


ungroup(Neocalanus_EMA_Final)


#NOw combine EMA and EcoDAAT data together

Neocalanus_Final <- rbind(Neocalanus_EMA_Final, Neocalanus_EcoDAAT_Final)

#Add to final dataset


NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Neocalanus_Final)

Oithona spp.


Oithona <- filter(NBS_Zoop_Process, TAXA_COARSE=="Oithona spp.")

#Filter for small nets only

Oithona <- filter(Oithona, GEAR_NAME!="60BON")


#Add to final dataset


NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Oithona)

Ostracoda


Ostracoda <- filter(NBS_Zoop_Process, TAXA_COARSE=="Ostracoda")

Polychaeta


Polychaeta <- filter(NBS_Zoop_Process, TAXA_COARSE=="Polychaeta")

#Split into small and large estimates from the correct nets and meshes

Polychaeta_large <- filter(Polychaeta, GEAR_NAME=="60BON")


#Rename Polychaeta large

Polychaeta_large$TAXA_COARSE[Polychaeta_large$TAXA_COARSE=="Polychaeta"] <- "Polychaeta_large"


#Now do the small nets

Polychaeta_small <- filter(Polychaeta, GEAR_NAME!="60BON")

#Rename Polychaeta small

Polychaeta_small$TAXA_COARSE[Polychaeta_small$TAXA_COARSE=="Polychaeta"] <- "Polychaeta_small"


#Add to final dataset


NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Polychaeta_large, Polychaeta_small)

Pseudocalanus


Pseudocalanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Pseudocalanus spp.")

#Filter for the small nets only

Pseudocalanus <- filter(Pseudocalanus, GEAR_NAME!="60BON")


#Add to final dataset


NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Pseudocalanus)

Thaliacea


Thaliacea <- filter(NBS_Zoop_Process, TAXA_COARSE=="Thaliacea")

Themisto abyssorum


Themisto_abyssorum <- filter(NBS_Zoop_Process, TAXA_COARSE=="Themisto abyssorum")

Themisto libellula


Themisto_libellula <- filter(NBS_Zoop_Process, TAXA_COARSE=="Themisto libellula")

#Filter for the 60BON nets only

Themisto_libellula <- filter(Themisto_libellula, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Themisto_libellula)

Themisto pacifica


Themisto_pacifica <- filter(NBS_Zoop_Process, TAXA_COARSE=="Themisto pacifica")

#Filter for the 60BON nets only

Themisto_pacifica <- filter(Themisto_pacifica, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Themisto_pacifica)

Themisto spp.


Themisto <- filter(NBS_Zoop_Process, TAXA_COARSE=="Themisto spp.")

#Filter for the 60BON nets only

Themisto<- filter(Themisto, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Themisto)

Thysanoessa species


Thysanoessa <- filter(NBS_Zoop_Process, TAXA_COARSE=="Thysanoessa inermis"|TAXA_COARSE=="Thysanoessa inspinata"|TAXA_COARSE=="Thysanoessa longipes"|TAXA_COARSE=="Thysanoessa raschii"|TAXA_COARSE=="Thysanoessa spinifera")

#Select for 60BON only

Thysanoessa <- filter(Thysanoessa, GEAR_NAME=="60BON")

#Now the correct stages

Thysanoessa <- filter(Thysanoessa, STAGE_NAME=="A + J (ADULT/JUVENILE)"|STAGE_NAME=="JUVENILE"|STAGE_NAME=="ADULT")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Thysanoessa)

Tortanus discaudatus


Tortanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Tortanus discaudatus")

#Separate EMA data as they were sorted under different protocols

Tortanus_EMA <- filter(Tortanus, DATA_SOURCE=="EMA")
Tortanus_EcoDAAT <- filter(Tortanus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Tortanus_EcoDAAT_bySPECIMEN_FORM <- group_by(Tortanus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Tortanus_EcoDAAT_FormSummary <- summarise(Tortanus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override
using the `.groups` argument.
#EcoDAAT data are correctly specified



#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Tortanus_EMA_byGEAR_NAME <- group_by(Tortanus_EMA, MESH, GEAR_NAME)

Tortanus_EMA_GearSummary <- summarise(Tortanus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the
`.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Tortanus_EMA_60BON <- filter(Tortanus_EMA, GEAR_NAME=="60BON")

Tortanus_EMA_60BON_333 <- filter(Tortanus_EMA_60BON, MESH==333)

Tortanus_EMA_60BON_333 <- filter(Tortanus_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)")

Tortanus_EMA_60BON_505 <- filter(Tortanus_EMA_60BON, MESH==505)

Tortanus_EMA_60BON_505 <- filter(Tortanus_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)")



Tortanus_EMA_smallnets <- filter(Tortanus_EMA, GEAR_NAME!="60BON")


Tortanus_EMA_smallnets <- filter(Tortanus_EMA_smallnets, STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)"|STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 1 (COPEPODITE I)")

#The other gears are correct, so rebuild dataset

Tortanus_EMA_Final <- rbind(Tortanus_EMA_60BON_333, Tortanus_EMA_60BON_505, Tortanus_EMA_smallnets)

ungroup(Tortanus_EMA_Final)

#Remove some files

rm(Tortanus_EMA_byGEAR_NAME,  Tortanus_EMA_smallnets, Tortanus_EMA_60BON, Tortanus_EMA_60BON_333, Tortanus_EMA_60BON_505)

#Combine into final, Tortanus data set

Tortanus <- rbind(Tortanus_EMA_Final, Tortanus_EcoDAAT)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Tortanus)

Now do biomass conversions


#NOw read in the biomass conversion data set

Biomass_annotated <- read_xlsx(here("data", "Biomass", "Biomass-Annotated.xlsx"))

#Merge the two data sets based on TAXA_COARSE, STAGE_NAME, SEX_NAME

NBS_Zoop_Process_Final <- left_join(NBS_Zoop_Process_Final, Biomass_annotated, by = c("TAXA_COARSE", "STAGE_NAME", "SEX_NAME"))

#Do some tidying to eliminate some columns

NBS_Zoop_Process_Final$NOTE <- NULL
NBS_Zoop_Process_Final$IND_WW_MG_NOTE <- NULL
NBS_Zoop_Process_Final$IND_DW_MG_CONVERTED_NOTE <- NULL
NBS_Zoop_Process_Final$IND_C_MG_CONVERTED_NOTE <- NULL
NBS_Zoop_Process_Final$GROWTH_RATE_NOTE <- NULL

#Create wet weight biomass column converted individual wet weight and abundance

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_WW_MG_M3_MEAN = IND_WW_MG_MEASURED_MEAN*EST_NUM_PERM3)

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_WW_MG_M3_SD = IND_WW_MG_MEASURED_SD*EST_NUM_PERM3)

#Create dry weight biomass column converted individual dry weight and abundance

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_DW_MG_M3_MEAN = IND_DW_MG_CONVERTED_MEAN*EST_NUM_PERM3)

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_DW_MG_M3_SD = IND_DW_MG_CONVERTED_SD*EST_NUM_PERM3)

#Create carbon weight biomass column converted individual carbon weight and abundance

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_C_MG_M3_MEAN = IND_C_MG_CONVERTED_MEAN*EST_NUM_PERM3)

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_C_MG_M3_SD = IND_C_MG_CONVERTED_SD*EST_NUM_PERM3)


#Create carbon weight biomass column converted individual carbon weight and abundance

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, PRODUCTION_MG_C_D_MEAN = (IND_C_MG_CONVERTED_MEAN*EST_NUM_PERM3*GROWTH_RATE_MEAN)*24)

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, PRODUCTION_MG_C_D_SD = (IND_C_MG_CONVERTED_SD*EST_NUM_PERM3*GROWTH_RATE_SD)*24)

Now write processed dataset after adding biomass information


write.csv(NBS_Zoop_Process_Final, here("data", "Processed_Data", "NBS_Zoop_Process_Final.csv"), row.names = FALSE)
LS0tCnRpdGxlOiAiQlAgU3ludGhlc2lzIERhdGEgU2V0IENvbnN0cnVjdGlvbiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCkxvYWQgcGFja2FnZXMgdG8gYmUgdXNlZCBpbiB0aGUgYW5hbHlzaXMKCmBgYHtyfQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlYWR4bCkKIyAiUk9EQkMiLCAiaGVyZSIsICJybmF0dXJhbGVhcnRoIiwgInJuYXR1cmFsZWFydGhkYXRhIiwgIm1hcHMiLCAibWFwZGF0YSIsICJtYXJtYXAiLCAicmdkYWwiKQogCgpgYGAKClJlYWQgaW4gdGhlIEVNQSBkYXRhIGZpbGVzCgpgYGB7cn0KCkJBU0lTX1pvb18xOTk5XzIwMDQgPC0gcmVhZF94bHN4KGhlcmUoICJkYXRhIiwgIlJhdy1EYXRhIiwgIkVNQS1IaXN0b3JpY2FsLURhdGEiLCAiQkFTSVNfWm9vXzE5OTlfMjAwNC54bHN4IiksIGNvbF90eXBlcyA9IGMoInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgImRhdGUiLCAiZGF0ZSIsICJkYXRlIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiKSkKCgpCQVNJU19ab29fMjAwNV8yMDA5IDwtIHJlYWRfeGxzeCAoaGVyZSgiZGF0YSIsICJSYXctRGF0YSIsICJFTUEtSGlzdG9yaWNhbC1EYXRhIiwgIkJBU0lTX1pvb18yMDA1XzIwMDkueGxzeCIpLCBjb2xfdHlwZXMgPSBjKCJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJkYXRlIiwgImRhdGUiLCAiZGF0ZSIsICJudW1lcmljIiwgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIikpCgpCQVNJU19ab29fMjAxMF8yMDEzIDwtIHJlYWRfeGxzeCAoaGVyZSgiZGF0YSIsICJSYXctRGF0YSIsICJFTUEtSGlzdG9yaWNhbC1EYXRhIiwgIkJBU0lTX1pvb18yMDEwXzIwMTMueGxzeCIpLCBjb2xfdHlwZXMgPSBjKCJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJkYXRlIiwgImRhdGUiLCAiZGF0ZSIsICJudW1lcmljIiwgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIikpCgpCQVNJU19ab29fMjAxNF8yMDE3IDwtIHJlYWRfeGxzeCAoaGVyZSgiZGF0YSIsICJSYXctRGF0YSIsICJFTUEtSGlzdG9yaWNhbC1EYXRhIiwgIkJBU0lTX1pvb18yMDE0XzIwMTdfTG9uQ29ycmVjdGVkLnhsc3giKSwgY29sX3R5cGVzID0gYygidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAiZGF0ZSIsICJkYXRlIiwgImRhdGUiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpKQoKRU1BX0NvbWJpbmVkIDwtIHJiaW5kKEJBU0lTX1pvb18xOTk5XzIwMDQsIEJBU0lTX1pvb18yMDA1XzIwMDksIEJBU0lTX1pvb18yMDEwXzIwMTMsIEJBU0lTX1pvb18yMDE0XzIwMTcpCgpybShCQVNJU19ab29fMTk5OV8yMDA0LCBCQVNJU19ab29fMjAwNV8yMDA5LCBCQVNJU19ab29fMjAxMF8yMDEzLCBCQVNJU19ab29fMjAxNF8yMDE3KQoKYGBgCgoKCkNvbnZlcnQgRU1BIGZpZWxkcyBpbnRvIEVjb0RBQVQgZmllbGRzCgpgYGB7cn0KCiNDcmVhdGUgREFZLCBNT05USCwgWUVBUiBjb2x1bW5zIGZyb20gIkhhdWxEYXRlIgoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSAgRU1BX0NvbWJpbmVkCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHNlcGFyYXRlKEVNQV9Db21iaW5lZF9SZWNvZGUsIEhhdWxEYXRlLCBjKCJZRUFSIiwgIk1PTlRIIiwgIkRBWSIpLCBzZXA9Ii0iKQoKI0RlbGV0ZSB5ZWFyIGNvbHVtbiBmcm9tIHRoZSBIYXVsSUQgYXMgdGhlcmUgaXMgYWxyZWFkeSBhIHllYXIgY29sdW1uCgpFTUFfQ29tYmluZWRfUmVjb2RlJFlFQVIgPC0gTlVMTApFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBZRUFSID0gWWVhcikKCgojRXh0cmFjdCBDcnVpc2UgY29kZSAKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPC0gc3Vic3RyaW5nIChFTUFfQ29tYmluZWRfUmVjb2RlJFN0YXRpb25JRCwgNSw2KQoKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VfSUQgPC0gc3Vic3RyaW5nIChFTUFfQ29tYmluZWRfUmVjb2RlJFN0YXRpb25JRCwgNyw4KQoKI1JlY29kIENydWlzZSBjb2RlIHdpdGggc2hpcCBJRCBhbmQgCgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRSA9PSAiMDEiXSA8LSAiU1MiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwMiJdIDwtICJOV0UiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwMyJdIDwtICJEWSIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjA0Il0gPC0gIkdQIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRSA9PSAiMDUiXSA8LSAiRUUiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwNiJdIDwtICJIRSIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjA3Il0gPC0gIkxVIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRSA9PSAiMDgiXSA8LSAiQkUiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwOSJdIDwtICJBRSIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjEwIl0gPC0gIkpDIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRSA9PSAiMTEiXSA8LSAiU1QiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIxMiJdIDwtICJDSCIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjEzIl0gPC0gIlNBIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRSA9PSAiMTQiXSA8LSAiUVUiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIxNSJdIDwtICJDRiIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjE2Il0gPC0gIk9TIgoKI0dldCBsYXN0IHR3byBkaWdpdHMgb2YgeWVhcgoKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VfWUVBUiA8LSBzdWJzdHJpbmcgKEVNQV9Db21iaW5lZF9SZWNvZGUkWUVBUiwgMyw0KQoKI0NvbWJpbmVkIENSVUlTRSB3aXRoIAoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSB1bml0ZShFTUFfQ29tYmluZWRfUmVjb2RlLCAiQ1JVSVNFIiwgQ1JVSVNFLCBDUlVJU0VfWUVBUiwgc2VwPSIiKQoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSB1bml0ZShFTUFfQ29tYmluZWRfUmVjb2RlLCAiQ1JVSVNFIiwgQ1JVSVNFLCBDUlVJU0VfSUQsIHNlcCA9ICItIikKCgojQ291bnQgbnVtYmVyIG9mIGNydWlzZXMgaW4gdGhlIEVNQSBkYXRhc2V0CgpFTUFfQ29tYmluZWRfUmVjb2RlX2J5Q1JVSVNFIDwtIGdyb3VwX2J5KEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSkKRU1BX0NvbWJpbmVkX1JlY29kZV9DcnVpc2VDb3VudCA8LSBzdW1tYXJpc2UoRU1BX0NvbWJpbmVkX1JlY29kZV9ieUNSVUlTRSwgbl9kaXN0aW5jdChZRUFSKSkKCnVuZ3JvdXAoRU1BX0NvbWJpbmVkX1JlY29kZSkKCgojUmVjb2RlIGNydWlzZXMgdG8gbWF0Y2ggbm9tZW5jbGF0dXJlIGNoYW5nZSBpbiAyMDEzIChpLmUuLCAyRFkxMiBiZWNvbWVzIERZMTMtMDIgaW4gMjAxMykKCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iQkUxMS0wMSJdIDwtICIxQkUxMSIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJCRTEyLTAxIl0gPC0gIjFCRTEyIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IkRZMDctMDIiXSA8LSAiMk9EMDciCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRFkwOC0wNiJdIDwtICI2RFkwOCIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJEWTA5LTA1Il0gPC0gIjVEWTA5IgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IkRZMTAtMDQiXSA8LSAiNERZMTAiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRFkxMS0wNCJdIDwtICI0RFkxMSIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJEWTEyLTAzIl0gPC0gIjNEWTEyIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IkVFMDktMDEiXSA8LSAiMUVFMDkiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRUUxMC0wMSJdIDwtICIxRUUxMCIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJHUDAwLTAxIl0gPC0gIjFHUDAwIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IkdQOTktMDEiXSA8LSAiMUdQOTkiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iTldFMDYtMDEiXSA8LSAiMU5XMDYiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iU1MwMi0wMSJdIDwtICIxU1MwMiIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJTUzAzLTAxIl0gPC0gIjFTUzAzIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IlNTMDQtMDEiXSA8LSAiMVNTMDQiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iU1MwNS0wMSJdIDwtICIxU1MwNSIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJTUzA2LTAxIl0gPC0gIjFTUzA2IgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IlNTMDctMDEiXSA8LSAiMVNTMDciCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iTldFMTctMDUiXSA8LSAiTlcxNy0wNSIKCiNSZW1vdmUgYSBmZXcgZmlsZXMKCnJtKEVNQV9Db21iaW5lZF9SZWNvZGVfYnlDUlVJU0UsIEVNQV9Db21iaW5lZF9SZWNvZGVfQ3J1aXNlQ291bnQpCgoKI1JlbmFtZSBBYnVuZGFuY2UgdG8gRVNUX05VTV9QRVJNMwoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgRVNUX05VTV9QRVJNMyA9IEFidW5kYW5jZSkKCiNSZW5hbWUgR2VhckRlcHRoIHRvIE1BWF9HRUFSX0RFUFRIIGFuZCB1c2UgdG8gY2FsY3VsYXRlIEVTVF9OVU1fUEVSTTMKCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gcmVuYW1lKEVNQV9Db21iaW5lZF9SZWNvZGUsIE1BWF9HRUFSX0RFUFRIID0gR2VhckRlcHRoKQoKI0NvbXB1dGUgRVNUX05VTV9QRVJNMiA9IEVTVF9OVU1fUEVSTTMgKiBNQVhfR0VBUl9ERVBUSAoKRU1BX0NvbWJpbmVkX1JlY29kZSRFU1RfTlVNX1BFUk0yIDwtIEVNQV9Db21iaW5lZF9SZWNvZGUkRVNUX05VTV9QRVJNMypFTUFfQ29tYmluZWRfUmVjb2RlJE1BWF9HRUFSX0RFUFRICgojQ3JlYXRlIGNvbHVtbnMgR0VBUl9OQU1FLCBNRVNIIGZyb20gR2VhckNvZGUgY29sdW1uCgpFTUFfQ29tYmluZWRfUmVjb2RlJEdlYXJDb2RlW0VNQV9Db21iaW5lZF9SZWNvZGUkR2VhckNvZGUgPT0gIkJvbmdvMTUzIl0gPC0gIjIwQk9OXzE1MyIKRU1BX0NvbWJpbmVkX1JlY29kZSRHZWFyQ29kZVtFTUFfQ29tYmluZWRfUmVjb2RlJEdlYXJDb2RlID09ICJCb25nbzMzMyJdIDwtICI2MEJPTl8zMzMiCkVNQV9Db21iaW5lZF9SZWNvZGUkR2VhckNvZGVbRU1BX0NvbWJpbmVkX1JlY29kZSRHZWFyQ29kZSA9PSAiQm9uZ281MDUiXSA8LSAiNjBCT05fNTA1IgpFTUFfQ29tYmluZWRfUmVjb2RlJEdlYXJDb2RlW0VNQV9Db21iaW5lZF9SZWNvZGUkR2VhckNvZGUgPT0gIkJvbmdvODAiXSA8LSAiODBCT05fMTUzIgpFTUFfQ29tYmluZWRfUmVjb2RlJEdlYXJDb2RlW0VNQV9Db21iaW5lZF9SZWNvZGUkR2VhckNvZGUgPT0gIkp1ZGF5Il0gPC0gIkp1ZGF5XzE2OCIKRU1BX0NvbWJpbmVkX1JlY29kZSRHZWFyQ29kZVtFTUFfQ29tYmluZWRfUmVjb2RlJEdlYXJDb2RlID09ICJQYWlyb1ZFVCJdIDwtICJQYWlyb1ZFVF8xNTMiCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHNlcGFyYXRlKEVNQV9Db21iaW5lZF9SZWNvZGUsIEdlYXJDb2RlLCBjKCJHRUFSX05BTUUiLCAiTUVTSCIpLCBzZXAgPSAiXyIpCgojUmVuYW1lIEdlYXJJblRpbWUgdG8gR01UX0RBVEVfVElNRV9UWFQKCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gcmVuYW1lKEVNQV9Db21iaW5lZF9SZWNvZGUsIEdNVF9EQVRFX1RJTUVfVFhUID0gR2VhckluVGltZSkKICAKI1JlbmFtZSBRdWFsaXR5IHRvIEhBVUxfUEVSRk9STUFOQ0UgYW5kIHJlY29kZSB0byBtYXRjaCBFY29EQUFUIAoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgSEFVTF9QRVJGT1JNQU5DRSA9IFF1YWxpdHkpCgpFTUFfQ29tYmluZWRfUmVjb2RlJEhBVUxfUEVSRk9STUFOQ0VbRU1BX0NvbWJpbmVkX1JlY29kZSRIQVVMX1BFUkZPUk1BTkNFID09ICJHIl0gPC0gIkdPT0QiCkVNQV9Db21iaW5lZF9SZWNvZGUkSEFVTF9QRVJGT1JNQU5DRVtFTUFfQ29tYmluZWRfUmVjb2RlJEhBVUxfUEVSRk9STUFOQ0UgPT0gIlEiXSA8LSAiUVVFU1QiCgojQ3JlYXRlIExBVCBhbmQgTE9OIGNvbHVtbiBmcm9tIEdlYXJJbkxhdGl0dWRlIGFuZCBHZWFyIGluIExvbmdpdHVkZQoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgTEFUID0gR2VhckluTGF0aXR1ZGUpCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBMT04gPSBHZWFySW5Mb25naXR1ZGUpCgojQ3JlYXRlIGNvbHVtbiBTRVhfTkFNRSBmcm9tIFNleCBhbmQgcmVjb2RlIHRvIG1hdGNoIEVjb0RBQVQgY2F0ZWdvcmllcwoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgU0VYX05BTUUgPSBTZXgpCgpFTUFfQ29tYmluZWRfUmVjb2RlJFNFWF9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU0VYX05BTUUgPT0gIk0iXSA8LSAiTUFMRSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTRVhfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNFWF9OQU1FID09ICJGIl0gPC0gIkZFTUFMRSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTRVhfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNFWF9OQU1FID09ICJVIl0gPC0gIk5PVCBERVRFUk1JTkVEIgoKI0VNQSBTaXplIGNhdGVnb3JpZXMgYXJlIG51bWVyb3VzLCBzbyBrZWVwIHRoaXMgY29sdW1uLCBidXQgcmVuYW1lIGFzIFNJWkVfTkFNRSBmb3IgbWVyZ2luZwoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgU0laRV9OQU1FID0gU2l6ZSkKCiNDcmVhdGUgU1RBR0VfTkFNRSBjYXRlZ29yeSBieSByZW5hbWluZyAiU3RhZ2VDb2RlIiBhbmQgcmVjb2RpbmcKCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gcmVuYW1lKEVNQV9Db21iaW5lZF9SZWNvZGUsIFNUQUdFX05BTUUgPSBTdGFnZUNvZGUpCgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJBIl0gPC0gIkFEVUxUIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJBICYgSiJdIDwtICJBICsgSiAoQURVTFQvSlVWRU5JTEUpIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJhZHVsdCJdIDwtICJBRFVMVCIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQWR1bHQiXSA8LSAiQURVTFQiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkMxIl0gPC0gIkMgLSAxIChDT1BFUE9ESVRFIEkpIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMS0yIl0gPC0gIkMtMSBUTyBDLTIiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkMxLTMiXSA8LSAiQy0xIFRPIEMtMyIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzEtNCJdIDwtICJDLTEgVE8gQy00IgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMS01Il0gPC0gIkMtMSBUTyBDLTUiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkMxLUM0Il0gPC0gIkMtMSBUTyBDLTQiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkMyIl0gPC0gIkMgLSAyIChDT1BFUE9ESVRFIElJKSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzItQzMiXSA8LSAiQy0yIFRPIEMtMyIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzItQzUiXSA8LSAiQy0yIFRPIEMtNSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzMiXSA8LSAiQyAtIDMgKENPUEVQT0RJVEUgSUlJKSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzMtQzQiXSA8LSAiQy0zIFRPIEMtNCIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzMtQzUiXSA8LSAiQy0zIFRPIEMtNSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzQiXSA8LSAiQyAtIDQgKENPUEVQT0RJVEUgSVYpIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDNC1DNSJdIDwtICJDLTQgVE8gQy01IgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDNC1DNiJdIDwtICJDLTQgVE8gQy02IgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDNSJdIDwtICJDIC0gNSAoQ09QRVBPRElURSBWKSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzYiXSA8LSAiQURVTFQiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImNhbHlwdG9waXMiXSA8LSAiQ0FMWVBUT1BJUyAoU1RBR0UgTk9UIERFVEVSTUlORUQpIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJjYWx5cHRvcGlzIDEiXSA8LSAiQ0FMWVBUT1BJUyAoU1RBR0UgTk9UIERFVEVSTUlORUQpIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJjYWx5cHRvcGlzIDIiXSA8LSAiQ0FMWVBUT1BJUyAoU1RBR0UgTk9UIERFVEVSTUlORUQpIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJjYWx5cHRvcGlzIDMiXSA8LSAiQ0FMWVBUT1BJUyAoU1RBR0UgTk9UIERFVEVSTUlORUQpIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJjeXByaXMiXSA8LSAiQ1lQUklTIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDeXByaXMiXSA8LSAiQ1lQUklTIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJlZ2ciXSA8LSAiRUdHIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJFZ2ciXSA8LSAiRUdHIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJmdXJjaWxpYSJdIDwtICJGVVJDSUxJQSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiRnVyY2lsaWEiXSA8LSAiRlVSQ0lMSUEiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkoiXSA8LSAiSlVWRU5JTEUiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImp1dmVuaWxlIl0gPC0gIkpVVkVOSUxFIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJKdXZlbmlsZSJdIDwtICJKVVZFTklMRSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAibGFydmEiXSA8LSAiTEFSVkEiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkxhcnZhIl0gPC0gIkxBUlZBIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJsYXJ2YWwiXSA8LSAiTEFSVkEiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkxhcnZhbCJdIDwtICJMQVJWQSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAibWVkdXNhIl0gPC0gIk1FRFVTQSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiTWVkdXNhIl0gPC0gIk1FRFVTQSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAibWVnYWxvcGEiXSA8LSAiTUVHQUxPUEFFIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJNZWdhbG9wYSJdIDwtICJNRUdBTE9QQUUiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIm5hdXBsaXVzIl0gPC0gIk5BVVBMSVVTIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJOYXVwbGl1cyJdIDwtICJOQVVQTElVUyIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiTkQiXSA8LSAiTk9UIERFVEVSTUlORUQiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gInBvc3QtbGFydmEiXSA8LSAiUE9TVCBMQVJWQSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiVSJdIDwtICJOT1QgREVURVJNSU5FRCIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiem9lYSJdIDwtICJaT0VBIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJab2VhIl0gPC0gIlpPRUEiCgojQ3JlYXRlIENvbHVtbiBTVEFUSU9OX05BTUUgYnkgdXNpbmcgdGhlIGxhc3QgMyBkaWdpdHMgb2YgU3RhdGlvbklECgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQVRJT05fTkFNRTwtIHN1YnN0cmluZyAoRU1BX0NvbWJpbmVkX1JlY29kZSRTdGF0aW9uSUQsIDksMTEpCgojQ3JlYXRlIFRBWE9OX05BTUUgY29sdW1uIGFuZCByZWNvZGUgdG8gbWF0Y2ggRWNvREFBVAoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgVEFYT05fTkFNRSA9IEN1cnJlbnRfTmFtZSkKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkFjYW50aG9teXNpcyBzcC4iXSA8LSAiQWNhbnRob215c2lzIHNwcC4iCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJBY2FudGhvbXlzaXMgc3RlbGxlcmkiXSA8LSAiQWNhbnRob215c2lzIHN0ZWxsZXJpIChFeGFjYW50aG9teXNpcyBhcmN0b3BhY2lmaWNhKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkFudGhvYXRoZWNhdGFlIl0gPC0gIkFudGhvYXRoZWNhdGEgKEFudGhvbWVkdXNhZSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJDYW5jcmlkYWUiXSA8LSAiQ2FuY3JpZGFlIChCcmFjaHl1cmEpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiQ2FuZGFjaWEgY29sdW1iaWFlIl0gPC0gIkNhbmRhY2lhIENvbHVtYmlhZSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkNhcHJlbGxpZGVhIl0gPC0gIkNhcHJlbGxpZGFlIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiQ2x5dGlhIGdyZWdhcmlhIl0gPC0gIkNseXRpYSBncmVnYXJpYSAoUGhpYWxpZGl1bSBncmVnYXJpdW0pIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiQ25pZGFyaWEiXSA8LSAiQ25pZGFyaWFuIG1lZHVzYWUiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJDb3JvcGhpdW0gc3BwLiJdIDwtICJDb3JvcGhpdW0iCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJEaXNhY2FudGhvbXlzaXMgZHlib3dza2lpIl0gPC0gIkRpc2NhbnRob215c2lzIChBY2FudGhvbXlzaXMpIER5Ym93c2tpaSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkVwaWxhYmlkb2NlcmEgYW1waGl0cml0ZXMiXSA8LSAiRXBpbGFiaWRvY2VyYSBhbXBoaXRyaXRlcyAoRS4gbG9uZ2lwZWRhdGEpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiRXBpbGFiaWRvY2VyYSBsb25naXBlZGF0YSJdIDwtICJFcGlsYWJpZG9jZXJhIGFtcGhpdHJpdGVzIChFLiBsb25naXBlZGF0YSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJFdXBoYXVzaWEgc3BwLiJdIDwtICJFdXBoYXVzaWFjZWEiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJFdXJ5dGVtb3JhIHBhY2lmaWNhIl0gPC0gIkV1cnl0ZW1vcmEgcGFjaWZpY2EgKEUuIGpvaGFuc2VuaSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJFdXJ5dGVtb3JhIHNwLiJdIDwtICJFdXJ5dGVtb3JhIHNwcC4iCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJHYW1tYXJpZGFlIl0gPC0gIkdhbW1hcmlkZWEgKFVuaWRlbnRpZmlhYmxlKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkdhbW1hcmlkZWEiXSA8LSAiR2FtbWFyaWRlYSAoVW5pZGVudGlmaWFibGUpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiSGlwcG9seXRpZGFlIl0gPC0gIkhpcHBvbHl0aWRhZSAoQ2FyaWRlYSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJIeWRyb21lZHVzYWUgKEh5ZHJvaWRvbGluYSJdIDwtICJIeWRyb21lZHVzYWUiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJMZXB0b3RoZWNhdGFlIl0gPC0gIkxlcHRvdGhlY2F0YSAoTGVwdG9tZWR1c2FlKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkxpdGhvZGlkYWUiXSA8LSAiTGl0aG9kaWRhZSAoQW5vbXVyYSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJNYWppZGFlIl0gPC0gIk1hamlkYWUgKEJyYWNoeXVyYSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJNZXRlcnl0aHJvcHMgcm9idXN0YSJdIDwtICJNZXRlcnl0aHJvcHMgcm9idXN0dXMgKE0uIHJvYnVzdGEpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiTXlzaWRhIl0gPC0gIk15c2lkYSAoVW5pZGVudGlmaWFibGUpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiT2N0b3BvZGEiXSA8LSAiT2N0b3BvZGlmb3JtZXMgKE9jdG9wdXMpIGxhcnZhZSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIk9pdGhvbmEgc2V0aWdlcmEiXSA8LSAiT2l0aG9uYSBzZXRpZ2VyYSAoTy4gc3Bpbmlyb3N0cmlzKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIk9pdGhvbmEgc3Bpbmlyb3N0cmlzIl0gPC0gIk9pdGhvbmEgc2V0aWdlcmEgKE8uIHNwaW5pcm9zdHJpcykiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJDaGlvbm9lY2V0ZXMgc3BwLiJdIDwtICJPcmVnb25paWRhZSAoQnJhY2h5dXJhKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkh5YXMgc3BwLiJdIDwtICJPcmVnb25paWRhZSAoQnJhY2h5dXJhKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIk9yZWdvbmlpZGFlIl0gPC0gIk9yZWdvbmlpZGFlIChCcmFjaHl1cmEpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiUGFjaWZhY2FudGhvbXlzaXMgbmVwaHJvcGh0aGFsbWEiXSA8LSAiUGFjaWZhY2FudGhvbXlzaXMgKEFjYW50aG9teXNpcykgbmVwaHJvcGh0aGFsbWEiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJQYWd1cmlkYWUiXSA8LSAiUGFndXJpZGFlIChBbm9tdXJhKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlBhcmFldWNoYWV0YSBlbG9uZ2F0YSJdIDwtICJQYXJhZXVjaGFldGEgZWxvbmdhdGEgKEV1Y2hhZXRhIGVsb25nYXRhKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlBhcmFzYWdpdHRhIGVsZWdhbnMiXSA8LSAiUGFyYXNhZ2l0dGEgKFNhZ2l0dGEpIGVsZWdhbnMiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJQaG9yb25pZGEgKGFjdGlub3Ryb2NoIGxhcnZhKSJdIDwtICJQaG9yb25pZGEgYWN0aW5vdHJvY2ggKGxhcnZhZSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJQb2RvbiBsZXVja2FydGlpIl0gPC0gIlBvZG9uIGxldWNrYXJ0aSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlBzZXVkb2FtYWxsb3Rocml4IG92YXRhIl0gPC0gIlBzZXVkb2FtYWxsb3Rocml4IChzY29sZWNpdGhyaWNlbGxhKSBvdmF0YSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlN5cnJob2UiXSA8LSAiU3lycmhvZSBzcHAuIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiVGVzc2FyYWJyYWNoaW9uIG9jdWxhdHVzIl0gPC0gIlRlc3NhcmFicmFjaGlvbiBvY3VsYXR1bSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlRoZWNvc29tYXRhIl0gPC0gIlRoZWNvc29tYXRhIChVbmlkZW50aWZpYWJsZSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJUaGVtaXN0byBwYWNpZmljYSJdIDwtICJUaGVtaXN0byBwYWNpZmljYSAoUGFyYXRoZW1pc3RvIHBhY2lmaWNhKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlRyaWNvbmlhIHNwLiJdIDwtICJUcmljb25pYSBzcHAuIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiQ2FsYW5pZGFlIl0gPC0gIlVuaWRlbnRpZmllZCBDYWxhbmlkcyIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkNhbGFub2lkYSJdIDwtICJVbmlkZW50aWZpZWQgQ2FsYW5pZHMiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJYZW5hY2FudGhvbXlzaXMgcHNldWRvbWFjcm9wc2lzIl0gPC0gIlhlbm9hY2FudGhvbXlzaXMgKEFjYW50aG9teXNpcykgcHNldWRvbWFjcm9wc2lzIgoKCgojQ3JlYXRlIFZPTFVNRV9GSUxURVJFRCBjb2x1bW4gYnkgcmVuYW1pbmcgVG93Vk9sdW1lIGNvbHVtbgoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgVk9MVU1FX0ZJTFRFUkVEID0gVG93Vm9sdW1lKQoKI1JlbmFtZSBCb3R0b21EZXB0aCB0byBCT1RUT01fREVQVEggdG8gbWF0Y2ggRWNvREFBVAoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgQk9UVE9NX0RFUFRIID0gQm90dG9tRGVwdGgpCgoKI1JlYXJyYW5nZSB0aGUgZmlsZSB0byBhZGQgYSBjb2x1bW4gaW5kaWNhdGluZyBvcmlnaW4gb2YgZGF0YSwgdG8gaGF2ZSB0aGVtIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBFY29EQUFUIGZpbGUgYW5kIHJlbW92ZSBub24tbWF0Y2hlZCBjb2x1bW5zIHByaW9yIHRvIG1lcmdlCgoKRU1BX0NvbWJpbmVkX1JlY29kZSREQVRBX1NPVVJDRSA8LSAiRU1BIgoKI0luc2V0IGNvbHVtbnMgbm90IHByZXNlbnQgaW4gRU1BLCBidXQgd2lsbCBiZSBpbiBFY29EQUFUCgpFTUFfQ29tYmluZWRfUmVjb2RlJERJU19QRVJWT0xNMiA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJERJU19QRVJWT0xNMyA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJEZPQ0lfSUQgPC0gTkEKRU1BX0NvbWJpbmVkX1JlY29kZSRGT0NJX1NBTVBMRV9JRCA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJEdFT0dSQVBISUNfQVJFQSA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJEhBVUxfSUQgPC0gTkEKRU1BX0NvbWJpbmVkX1JlY29kZSRIQVVMX05BTUUgPC0gTkEKRU1BX0NvbWJpbmVkX1JlY29kZSRNSU5fR0VBUl9ERVBUSCA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJE5FVCA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJFNBTVBMRV9ERVBUSCA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJFNFWCA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJFNQRUNJTUVOX0ZPUk0gPC0gTkEKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRSA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX1NJWkUgPC0gTkEKRU1BX0NvbWJpbmVkX1JlY29kZSRaT09QX0NPUEVQT0RfTkFVUExJSSA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJFpPT1BfRVVQSEFVU0lJRF9FR0cgPC0gTkEKCgojQ3JlYXRlIEhBVUxfSUQgY29sdW1uIGluZm9ybWF0aW9uIGZvciBtZXJnaW5nIHB1cnBvc2VzCgpFTUFfQ29tYmluZWRfUmVjb2RlJEhBVUxfSUQgPC0gcGFzdGUwKEVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFLCIgIixFTUFfQ29tYmluZWRfUmVjb2RlJFNUQVRJT05fTkFNRSwiICIsIDEsIiAiLCBFTUFfQ29tYmluZWRfUmVjb2RlJEdFQVJfTkFNRSwiICIsIDEpCgoKI0NyZWF0ZSB2ZWN0b3Igb2YgY29sdW1uIG5hbWVzIGZyb20gdGhlIEVjb0RBQVQgRmlsZQoKRWNvREFBVF9Db2x1bW5OYW1lcyA8LSBjKCJCT1RUT01fREVQVEgiLCAiQ1JVSVNFIiwgIkRBWSIsICJESVNfUEVSVk9MTTIiLCAiRElTX1BFUlZPTE0zIiwgIkVTVF9OVU1fUEVSTTIiLCAiRVNUX05VTV9QRVJNMyIsICJGT0NJX0lEIiwgIkZPQ0lfU0FNUExFX0lEIiwgIkdFQVJfTkFNRSIsICJHRU9HUkFQSElDX0FSRUEiLCAiR01UX0RBVEVfVElNRV9UWFQiLCAiSEFVTF9JRCIsICJIQVVMX05BTUUiLCAiSEFVTF9QRVJGT1JNQU5DRSIsICJMQVQiLCAiTE9OIiwgIk1BWF9HRUFSX0RFUFRIIiwgIk1FU0giLCAiTUlOX0dFQVJfREVQVEgiLCAiTU9OVEgiLCAiTkVUIiwgIlNBTVBMRV9ERVBUSCIsICJTRVgiLCAiU0VYX05BTUUiLCAiU0laRV9OQU1FIiwgIlNQRUNJTUVOX0ZPUk0iLCAiU1RBR0UiLCAiU1RBR0VfTkFNRSIsICJTVEFUSU9OX05BTUUiLCAiVEFYT05fTkFNRSIsICJUQVhPTl9TSVpFIiwgIlZPTFVNRV9GSUxURVJFRCIsICAiWUVBUiIsICJaT09QX0NPUEVQT0RfTkFVUExJSSIsICJaT09QX0VVUEhBVVNJSURfRUdHIiwgIkRBVEFfU09VUkNFIikKCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gRU1BX0NvbWJpbmVkX1JlY29kZVssIEVjb0RBQVRfQ29sdW1uTmFtZXNdCgpgYGAKCkltcG9ydCBFY29EQUFUIGRhdGEKCkNvbm5lY3QgdG8gZGF0YWJhc2UgdG8gaW1wb3J0IHpvb3AgZGF0YSBkaXJlY3RseSBmcm9tIEVjb0RBQVQKCmBgYHtyfQojQ3JlYXRlIGNvbm5lY3QgdG8gdGhlIEFGU0MgZGF0YWJhc2UKIyAKIyB1c2VyIDwtIHJlYWRsaW5lKCJJbnB1dCBVc2VybmFtZTogIikKIyBwc3dkIDwtIHJlYWRsaW5lKCJJbnB1dCBQYXNzd29yZDogIikKIyAKIyBBRlNDX0Nvbm5lY3QgPC0gb2RiY0Nvbm5lY3QoIkFGU0MiLCB1aWQ9dXNlciwgIHB3ZD1wc3dkKQojIAojIAojICNEZWxldGUgYW5kIHJlZnJlc2ggdGFibGUgdG8gZHJhdyBmcm9tLCBpbiB0aGlzIGNhc2UgaXQgaXMgU1BFQ0lNRU5fTUFJTl9HRU9NCiMgCiMgc3FsUXVlcnkoQUZTQ19Db25uZWN0LCJEUk9QIFRBQkxFIFNQRUNJTUVOX01BSU5fR0VPTTsiKQojIAojIHNxbFF1ZXJ5KEFGU0NfQ29ubmVjdCwiQ1JFQVRFIFRBQkxFIFNQRUNJTUVOX01BSU5fR0VPTSBBUyBTRUxFQ1QgKiBGUk9NIEVDT0RBQVQuU1BFQ0lNRU5fTUFJTl9HRU9NOyIpCgoKI1J1biBTUUwgUXVlcmllcyB0byBidWlsZCB6b29wbGFua3RvbiBkYXRhc2V0IAojIAojICNRdWVyeSB0aGUgZGF0YWJhc2UKIyAKIyB6b29wZGF0YSA8LSBzcWxRdWVyeShBRlNDX0Nvbm5lY3QsICJTRUxFQ1QgQk9UVE9NX0RFUFRILAojIENSVUlTRSwgREFZLCBESVNfUEVSVk9MTTIsIERJU19QRVJWT0xNMywgRVNUX05VTV9QRVJNMiwgRVNUX05VTV9QRVJNMywgRk9DSV9JRCwgRk9DSV9TQU1QTEVfSUQsIEdFQVJfTkFNRSwgCiMgR0VPR1JBUEhJQ19BUkVBLCBHTVRfREFURV9USU1FX1RYVCwgSEFVTF9JRCwgSEFVTF9OQU1FLCBIQVVMX1BFUkZPUk1BTkNFLCBMQVQsIExPTiwgTUFYX0dFQVJfREVQVEgsIE1FU0gsCiMgTUlOX0dFQVJfREVQVEgsIE1PTlRILCBORVQsIFNBTVBMRV9ERVBUSCwgU0VYLCBTRVhfTkFNRSwgU0laRV9OQU1FLCBTUEVDSU1FTl9GT1JNLCBTVEFHRSwgU1RBR0VfTkFNRSwgU1RBVElPTl9OQU1FLAojIFRBWE9OX05BTUUsIFRBWE9OX1NJWkUsIFZPTFVNRV9GSUxURVJFRCwgWUVBUiwgWk9PUF9DT1BFUE9EX05BVVBMSUksIFpPT1BfRVVQSEFVU0lJRF9FR0cKIyBGUk9NIFNQRUNJTUVOX01BSU5fR0VPTSBXSEVSRSBPUklHX0RCIExJS0UgJ0JPQic7Iiwgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSkKCiNDbG9zZSBkYXRhYmFzZSBjb25uZWN0aW9uCiAKIyBvZGJjQ2xvc2UoQUZTQ19Db25uZWN0KQoKI0Ryb3Agb25lIGNydWlzZSB1c2luZyB0aGUgb2xkIHByb3RvY29sIE9TMTcgYW5kIHJlcGxhY2Ugd2l0aCBjb3JyZWN0IGRhdGEKem9vcGRhdGEgPC0gcmVhZF9jc3YoaGVyZSgiZGF0YSIsIkFsbFpvb3BSYXcuY3N2IikpICU+JQogIGZpbHRlcighQ1JVSVNFPT0iT1MxNy0wMSIpICU+JQogIGRwbHlyOjpzZWxlY3QoLS4uLjEpCgojQnJpbmcgaW4gT1MxNy0wMQpPUzE3MDEgPC0gcmVhZC5jc3YoaGVyZSgiZGF0YSIsICJSYXctRGF0YSIsICJPUzE3MDFfRWNvRk9DSV9ab29wbGFua3Rvbk5ldC5jc3YiKSkKCnpvb3BkYXRhIDwtIHJiaW5kKHpvb3BkYXRhLCBPUzE3MDEpCgojRGVsZXRlIE9TMTcwMQoKcm0oT1MxNzAxKQoKCmBgYAoKRG8gc29tZSBkYXRhIHRpZHlpbmcgZm9yIHRoZSBFY29EQUFUIGRhdGEgc2V0IGFuZCBjb21iaW5lIHRoZSBFY29EQUFUIGFuZCBFTUEgZGF0YXNldHMKCgpgYGB7cn0KCiNSZWNvZGUgbWVzaCBzaXplcyBmb3IgMTUwLCAzMzMsIDUwMAoKem9vcGRhdGEkTUVTSFt6b29wZGF0YSRNRVNIPT0xNTBdIDwtIDE1Mwp6b29wZGF0YSRNRVNIW3pvb3BkYXRhJE1FU0g9PTE1NF0gPC0gMTUzCnpvb3BkYXRhJE1FU0hbem9vcGRhdGEkTUVTSD09MTE1M10gPC0gMTUzCnpvb3BkYXRhJE1FU0hbem9vcGRhdGEkTUVTSD09MzM1XSA8LSAzMzMKem9vcGRhdGEkTUVTSFt6b29wZGF0YSRNRVNIPT01MDBdIDwtIDUwNQoKCiNDb3VudCBudW1iZXIgb2YgY3J1aXNlcyBpbiB0aGUgRU1BIGRhdGFzZXQKCkVNQV9Db21iaW5lZF9SZWNvZGVfYnlDUlVJU0UgPC0gZ3JvdXBfYnkoRU1BX0NvbWJpbmVkX1JlY29kZSwgQ1JVSVNFKQpFTUFfQ29tYmluZWRfUmVjb2RlX0NydWlzZUNvdW50IDwtIHN1bW1hcmlzZShFTUFfQ29tYmluZWRfUmVjb2RlX2J5Q1JVSVNFLCBuX2Rpc3RpbmN0KFlFQVIpKQoKdW5ncm91cChFTUFfQ29tYmluZWRfUmVjb2RlKQoKI0NvdW50IG51bWJlciBvZiBjcnVpc2VzIGluIHRoZSBFTUEgZGF0YXNldAoKem9vcGRhdGFfYnlDUlVJU0UgPC0gZ3JvdXBfYnkoem9vcGRhdGEsIENSVUlTRSkKem9vcGRhdGFfQ3J1aXNlQ291bnQgPC0gc3VtbWFyaXNlKHpvb3BkYXRhX2J5Q1JVSVNFLCBuX2Rpc3RpbmN0KFlFQVIpKQoKdW5ncm91cCh6b29wZGF0YSkKIAoKI0RvIGEgam9pbiB0byBzZWUgaWYgY3J1aXNlcyBoYXZlIG1hdGNoZXMgaW4gYm90aCBkYXRhc2V0czoKClRlc3REYXRhIDwtIHNlbWlfam9pbihFTUFfQ29tYmluZWRfUmVjb2RlX0NydWlzZUNvdW50LCB6b29wZGF0YV9DcnVpc2VDb3VudCwgYnkgPSAiQ1JVSVNFIikKCgoKCiMxMCBjcnVpc2VzIGFyZSBwcmVzZW50IGluIEVNQSBkYXRhc2V0IGFuZCB6b29wZGF0YSBkYXRhIHNldCwgcmVtb3ZlIHRob3NlIGZyb20gdGhlIEVNQSBkYXRhc2V0IHRvIGF2b2lkIGRvdWJsZSBjb3VudGluZwoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSBmaWx0ZXIoRU1BX0NvbWJpbmVkX1JlY29kZSwgQ1JVSVNFIT0iMUdQOTkiKQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIGZpbHRlcihFTUFfQ29tYmluZWRfUmVjb2RlLCBDUlVJU0UhPSIzRFkxMiIpCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gZmlsdGVyKEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSE9IkFFMTQtMDEiKQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIGZpbHRlcihFTUFfQ29tYmluZWRfUmVjb2RlLCBDUlVJU0UhPSJBRTE1LTAxIikKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSBmaWx0ZXIoRU1BX0NvbWJpbmVkX1JlY29kZSwgQ1JVSVNFIT0iRFkxNC0wNiIpCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gZmlsdGVyKEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSE9IkRZMTQtMDgiKQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIGZpbHRlcihFTUFfQ29tYmluZWRfUmVjb2RlLCBDUlVJU0UhPSJEWTE1LTA3IikKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSBmaWx0ZXIoRU1BX0NvbWJpbmVkX1JlY29kZSwgQ1JVSVNFIT0iRFkxNS0wOCIpCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gZmlsdGVyKEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSE9IkRZMTYtMDkiKQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIGZpbHRlcihFTUFfQ29tYmluZWRfUmVjb2RlLCBDUlVJU0UhPSJOVzE3LTA1IikKCiNSZW1vdmVGaWxlcwoKcm0oRU1BX0NvbWJpbmVkX1JlY29kZV9ieUNSVUlTRSwgRU1BX0NvbWJpbmVkX1JlY29kZV9DcnVpc2VDb3VudCwgem9vcGRhdGFfYnlDUlVJU0UsIHpvb3BkYXRhX0NydWlzZUNvdW50LCBUZXN0RGF0YSkKCiNDb21iaW5lIHRoZSBFTUEgYW5kIEVjb0RBQVQgZGF0YXNldHMKCiNBZGQgRGF0YSBTb3VyY2UgZmlsZSB0byB0aGUgem9vcGRhdGEgcHJpb3IgdG8gY29tYmluYXRpb24KCnpvb3BkYXRhJERBVEFfU09VUkNFIDwtICJFY29EQUFUIgoKCiNDb21iaW5lIGRhdGFzZXRzIAoKQWxsWm9vcF9SYXcgPC0gcmJpbmQoRU1BX0NvbWJpbmVkX1JlY29kZSwgem9vcGRhdGEpCgoKCiNDcmVhdGUgdmVjdG9yIG9mIENvbWJpbmVkIGNvbHVtbiBuYW1lcyB0byB0cmltIGRhdGFzZXQgZm9yIGZpbmFsIHByb2Nlc3NpbmcKCkNvbWJpbmVkX0NvbHVtbk5hbWVzIDwtIGMoIkJPVFRPTV9ERVBUSCIsICJDUlVJU0UiLCAiREFZIiwgIkRJU19QRVJWT0xNMiIsICJESVNfUEVSVk9MTTMiLCAiRVNUX05VTV9QRVJNMiIsICJFU1RfTlVNX1BFUk0zIiwgIkdFQVJfTkFNRSIsICJHTVRfREFURV9USU1FX1RYVCIsICJIQVVMX0lEIiwgIkhBVUxfUEVSRk9STUFOQ0UiLCAiTEFUIiwgIkxPTiIsICJNQVhfR0VBUl9ERVBUSCIsICJNRVNIIiwgIk1PTlRIIiwgIlNQRUNJTUVOX0ZPUk0iLCAiU0VYX05BTUUiLCAiU0laRV9OQU1FIiwgIlNUQUdFX05BTUUiLCAiU1RBVElPTl9OQU1FIiwgIlRBWE9OX05BTUUiLCAiVk9MVU1FX0ZJTFRFUkVEIiwgICJZRUFSIiwgIkRBVEFfU09VUkNFIikKCiNLZWVwIG9ubHkgdGhvc2UgY29sdW1ucwoKQWxsWm9vcF9SYXcgPC0gQWxsWm9vcF9SYXdbLENvbWJpbmVkX0NvbHVtbk5hbWVzXQoKI1JlbW92ZSBmaWxlcwoKcm0gKEVNQV9Db21iaW5lZCwgRU1BX0NvbWJpbmVkX1JlY29kZSwgem9vcGRhdGEpCgoKCmBgYAoKClF1aWNrIG1hcCBvZiB0aGUgcmF3IGRhdGEgc3RhdGlvbnMKCmBgYHtyLCBldmFsID0gRkFMU0V9CgojUXVpY2sgcGxvdCB0byB0YWtlIGEgbG9vayBhdCB0aGUgZGF0YXNldCBzbyBmYXIKCiNHZXQgd29ybGQgZGF0YSBmcm9tICNuYXR1cmFsIGVhcnRoIHBhY2thZ2UKCndvcmxkIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJtZWRpdW0iLCByZXR1cm5jbGFzcyA9ICJzZiIpCmNsYXNzKHdvcmxkKQoKIyBnZXQgcmVnaW9uYWwgcG9seWdvbnMKcmVnID0gbWFwX2RhdGEoIndvcmxkMkhpcmVzIikKcmVnID0gc3Vic2V0KHJlZywgcmVnaW9uICVpbiUgYygnVVNTUicsICdVU0EnKSkKCiMgY29udmVydCBsYXQgbG9uZ3MKcmVnJGxvbmcgPSAoMzYwIC0gcmVnJGxvbmcpKi0xCgojIHNldCBtYXAgbGltaXRzCmxvbnMgPSBjKC0xNzkuNSwgLTEzMCkKbGF0cyA9IGMoNTAsIDc0KQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgCiMgIyBtYWtlIHBsb3QKIyBSZWdpb25fTWFwX1Jhd0RhdGEgPC0gZ2dwbG90KCkrCiMgCiMgICAjIGFkZCBjb2FzdGxpbmUKIyAgIGdlb21fc2YoZGF0YSA9IHdvcmxkKSsKIyAgICAgY29vcmRfc2YoeGxpbSA9IGxvbnMsIHlsaW0gPSBsYXRzLCBleHBhbmQgPSBGQUxTRSkrCiMgCiMgICAjUGxvdCBzdGF0aW9uIHBvaW50cwojICAgZ2VvbV9wb2ludChkYXRhPUFsbFpvb3BfUmF3LCBtYXBwaW5nPWFlcyhMT04sIExBVCkpKwojIAojICAgIyBmb3JtYXR0aW5nCiMgICB0aGVtZV9idygpKwojICAgeGxhYigiTG9uZ2l0dWRlIikrCiMgICB5bGFiKCJMYXRpdHVkZSIpCiMgCiMgUmVnaW9uX01hcF9SYXdEYXRhCgoKYGBgCgpEYXRhIEZpbHRlcmluZyBmb3IgQlAgU3ludGhlc2lzIFByb2plY3QKCmBgYHtyfQoKI0ZpcnN0IGZpbHRlciBmb3IgYWxsIGRhdGEgbm9ydGggb2YgNjBOCiAgICAgICAKIwpOQlNfWm9vcCA8LSBmaWx0ZXIoQWxsWm9vcF9SYXcsIExBVD49NTUpCgoKI05vdyBtYXAgYWdhaW4gdG8gdGFrZSBhIGxvb2sKIyAKIyAjIG1ha2UgcGxvdAojIFJlZ2lvbl9NYXBfTkJTX1Byb2Nlc3NfMSA8LSBnZ3Bsb3QoKSsKIyAKIyAgICMgYWRkIGNvYXN0bGluZQojICAgZ2VvbV9zZihkYXRhID0gd29ybGQpKwojICAgICBjb29yZF9zZih4bGltID0gbG9ucywgeWxpbSA9IGxhdHMsIGV4cGFuZCA9IEZBTFNFKSsKIyAKIyAgICNQbG90IHN0YXRpb24gcG9pbnRzCiMgICBnZW9tX3BvaW50KGRhdGE9TkJTX1pvb3AsIG1hcHBpbmc9YWVzKExPTiwgTEFUKSkrCiMgCiMgICAjIGZvcm1hdHRpbmcKIyAgIHRoZW1lX2J3KCkrCiMgICB4bGFiKCJMb25naXR1ZGUiKSsKIyAgIHlsYWIoIkxhdGl0dWRlIikKIyAKIyBSZWdpb25fTWFwX05CU19Qcm9jZXNzXzEKIyAKIyAKIyAjTG9va3MgbGlrZSBzb21lIGRhdGEgZnJvbSB0aGUgR09BIGlzIHN0aWxsIHByZXNlbnQsIHNvIHJlbW92ZSBkYXRhID4gMTU1CgojCk5CU19ab29wIDwtIGZpbHRlcihOQlNfWm9vcCwgTE9OPD0gLTE1MCkKCiNOb3cgbWFwIGFnYWluIHRvIHRha2UgYSBsb29rCiMgCiMgIyBtYWtlIHBsb3QKIyBSZWdpb25fTWFwX05CU19Qcm9jZXNzXzIgPC0gZ2dwbG90KCkrCiMgCiMgICAjIGFkZCBjb2FzdGxpbmUKIyAgIGdlb21fc2YoZGF0YSA9IHdvcmxkKSsKIyAgICAgY29vcmRfc2YoeGxpbSA9IGxvbnMsIHlsaW0gPSBsYXRzLCBleHBhbmQgPSBGQUxTRSkrCiMgCiMgICAjUGxvdCBzdGF0aW9uIHBvaW50cwojICAgZ2VvbV9wb2ludChkYXRhPU5CU19ab29wLCBtYXBwaW5nPWFlcyhMT04sIExBVCkpKwojIAojICAgIyBmb3JtYXR0aW5nCiMgICB0aGVtZV9idygpKwojICAgeGxhYigiTG9uZ2l0dWRlIikrCiMgICB5bGFiKCJMYXRpdHVkZSIpCiMgCiMgUmVnaW9uX01hcF9OQlNfUHJvY2Vzc18yCiMgCiMgI1NwYXRpYWwgY292ZXJhZ2UgbG9va3MgY29ycmVjdAoKI05vdyBjaGVjayB0ZW1wb3JhbCBjb3ZlcmFnZQoKc29ydCh1bmlxdWUoTkJTX1pvb3AkWUVBUiksIGRlY3JlYXNpbmcgPSBGQUxTRSkKCiNSZW1vdmUgZGF0YSBmcm9tIDE5OTYgYXMgaXQgaXMgcmVtb3ZlZCBmcm9tIGFsbCBvdGhlciB5ZWFycyBvZiBjb2xsZWN0aW9uCgpOQlNfWm9vcCA8LSBmaWx0ZXIoTkJTX1pvb3AsIFlFQVIhPTE5OTYpCgojVGFrZSBhIGxvb2sgYXQgdGhlIGdlYXJzIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQKCnVuaXF1ZShOQlNfWm9vcCRHRUFSX05BTUUpCnVuaXF1ZShOQlNfWm9vcCRNRVNIKQoKI1JvdWdoIGVzdGltYXRlIG9mIG51bWJlciBvZiBzYW1wbGVzIGJ5IGdlYXIgdHlwZQoKTkJTX1pvb3BfR2VhciA8LSBOQlNfWm9vcFssIGMoIkNSVUlTRSIsICJHRUFSX05BTUUiLCAiTUVTSCIsICJMQVQiLCAiTE9OIildCgpOQlNfWm9vcF9HZWFyIDwtIGRpc3RpbmN0KE5CU19ab29wX0dlYXIpCgpOQlNfWm9vcF9HZWFyX2J5R2VhciA8LSBncm91cF9ieShOQlNfWm9vcF9HZWFyLCBHRUFSX05BTUUsIE1FU0gpCgpOQlNfR2Vhcl9TdW1tYXJ5IDwtIHN1bW1hcmlzZShOQlNfWm9vcF9HZWFyX2J5R2VhciwgbigpKQoKdW5ncm91cChOQlNfWm9vcF9HZWFyKQoKI1RoaXMgc2hvd3MgYSBmZXcgZ2VhcnMgY2FuIGJlIGVsaW1pbmF0ZWQgZm9yIGxvdyBzYW1wbGUgc2l6ZSAoVjYwQk9OLCA4MEJPTikgYW5kIENBTFZFVCBoYXMgdG9vIHNtYWxsIG1lc2ggc2l6ZQoKTkJTX1pvb3AgPC0gZmlsdGVyKE5CU19ab29wLCBHRUFSX05BTUUhPSJDQUxWRVQiKQpOQlNfWm9vcCA8LSBmaWx0ZXIoTkJTX1pvb3AsIEdFQVJfTkFNRSE9IlY2MEJPTiIpCk5CU19ab29wIDwtIGZpbHRlcihOQlNfWm9vcCwgR0VBUl9OQU1FIT0iODBCT04iKQoKI1JlbW92ZSBzbGVkIGRhdGEgYXMgdGhpcyBpcyBiaWFzZWQgdG93YXJkIGEgYm90dG9tIHNhbXBsZQoKTkJTX1pvb3AgPC0gZmlsdGVyKE5CU19ab29wLCBHRUFSX05BTUUhPSJTTEVEIikKCgoKI1JlbW92ZSBmYWlsZWQgYW5kIHF1ZXN0aW9uYWJsZSBoYXVscwoKI0ZpcnN0IHNhdmUgdGhlIE5BIHNpbmNlIEVNQSBkYXRhIGRvZXMgbm90IGFsd2F5cyByZWNvcmQgSEFVTF9QRVJGT1JNQU5DRQoKSGF1bFBlcmZfTkEgPC0gTkJTX1pvb3BbaXMubmEoTkJTX1pvb3AkSEFVTF9QRVJGT1JNQU5DRSksXQoKTkJTX1pvb3BfR09PRCA8LSBmaWx0ZXIoTkJTX1pvb3AsIEhBVUxfUEVSRk9STUFOQ0U9PSJHT09EIikKCiNSZWJ1aWxkIGRhdGFzZXQgd2l0aG91dCBRVUVTVCBhbmQgRkFJTCBIQVVMUwoKTkJTX1pvb3AgPC0gcmJpbmQoSGF1bFBlcmZfTkEsIE5CU19ab29wX0dPT0QpCgoKCiNXcml0ZSB0aGlzIHJhdyBmaWxlIHByaW9yIHRvIGZ1cnRoZXIgcHJvY2Vzc2luZwoKd3JpdGUuY3N2KE5CU19ab29wLCBoZXJlKCJkYXRhIiwgIlJhdy1EYXRhIiwgIk5CU19ab29wX1Jhdy5jc3YiKSkKCmBgYAoKQnJpbmcgaW4gdGhlIENvYXJzZSBUYXhhIExpc3QgdG8gYWlkIGluIGx1bXBpbmcgYW5kIGZpbHRlciBvdXQgc29tZSB0YXhhCgoKYGBge3J9CgpUYXhhTGlzdF9Db2Fyc2UgPC0gcmVhZC5jc3YoaGVyZSgiZGF0YSIsICJUYXhhLUxpc3RzIiwgIlRheGFMaXN0X0NvYXJzZS5jc3YiKSkKCiNOb3cgYWRkIHRoaXMgdG8gdGhlIGZpbGUKClRheGFMaXN0X0NvYXJzZSA8LSBkaXN0aW5jdChUYXhhTGlzdF9Db2Fyc2UpCgpOQlNfWm9vcF9Qcm9jZXNzIDwtIGxlZnRfam9pbihOQlNfWm9vcCwgVGF4YUxpc3RfQ29hcnNlLCBieSA9ICJUQVhPTl9OQU1FIikKCiNGaWx0ZXIgb3V0IHRob3NlIGRhdGEgbWFya2VkIGZvciByZW1vdmFsCgpOQlNfWm9vcF9Qcm9jZXNzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBOT1RFICE9ICJSZW1vdmUiKQoKCmBgYAoKCgpDcmVhdGUgdGF4YSBzcGVjaWZpYyBkYXRhIHNldHMgdG8gc2VsZWN0IHRoZSBjb3JyZWN0IHN0YWdlcyBmcm9tIHRoZSBjb3JyZWN0IEdFQVJfTkFNRSBhbmQgTUVTSCBmb3IgZWFjaCBzcGVjaWZpYyBjb2Fyc2UgdGF4YQoKQWNhcnRpYSBzcHAKCmBgYHtyfQoKQWNhcnRpYV9zcHAgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQWNhcnRpYSBzcHAuIikKCiNBY2FydGlhIGlzIGEgc21hbGwgY29wZXBvZCwgc28gYWxsIGVzdGltYXRlcyBzaG91bGQgY29tZSBmcm9tIHRoZSBzbWFsbGVyIG5ldHMKCiNGaWx0ZXIgZm9yIGNvcnJlY3QgZ2VhcgoKQWNhcnRpYV9zcHAgPC0gZmlsdGVyKEFjYXJ0aWFfc3BwLCBHRUFSX05BTUUhPSAiNjBCT04iKQoKCiNCZWluZyB0byBidWlsZCBmaW5hbCBkYXRhIHNldAoKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gQWNhcnRpYV9zcHAKCgoKYGBgCgpBZ2xhbnRoYSBkaWdpdGFsZQoKYGBge3J9CgpBZ2xhbnRoYV9kaWdpdGFsZSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJBZ2xhbnRoYSBkaWdpdGFsZSIpCgojQ2hvb3NlIHRvIGVzdGltYXRlIENuaWRhcmlhbnMgZnJvbSB0aGUgNjBCT04gb25seQoKQWdsYW50aGFfZGlnaXRhbGUgPC0gZmlsdGVyKEFnbGFudGhhX2RpZ2l0YWxlLCBHRUFSX05BTUU9PSI2MEJPTiIpCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBBZ2xhbnRoYV9kaWdpdGFsZSkKCgpgYGAKCkFtcGhpcG9kcwoKYGBge3J9CgpBbXBoaXBvZGEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQW1waGlwb2RhIikKCiNBbWhpcG9kcyB3aWxsIGJlIGVzdGltYXRlZCBmcm9tIHRoZSA2MEJPTiBvbmx5CgpBbXBoaXBvZGEgPC0gZmlsdGVyKEFtcGhpcG9kYSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQW1waGlwb2RhKQoKCmBgYAoKCkFub211cmEKCmBgYHtyfQoKQW5vbXVyYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJBbm9tdXJhIikKCiNBbm9tdXJhIGVzdGltYXRlIGZyb20gNjBCT04gb25seQoKQW5vbXVyYSA8LSBmaWx0ZXIoQW1waGlwb2RhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEFub211cmEpCgoKYGBgCgoKQXBwZW5kaWN1bGFyaWEKCmBgYHtyfQoKQXBwZW5kaWN1bGFyaWEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQXBwZW5kaWN1bGFyaWEiKQoKI0NhbiBmaWx0ZXIgZm9yIGJvdGggZ2VhcnMgYW5kIHRoZW4gYWRkIGEgdGF4YSBjb2Fyc2Ugb2YgQXBwZW5kaWN1bGFyaWFfbGFyZ2UgYW5kIEFwcGVuZGljdWxhcl9zbWFsbAoKQXBwZW5kaWN1bGFyaWFfbGFyZ2UgPC0gZmlsdGVyKEFwcGVuZGljdWxhcmlhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojUmVjb2RlIGNvYXJzZSB0YXhhCgpBcHBlbmRpY3VsYXJpYV9sYXJnZSRUQVhBX0NPQVJTRVtBcHBlbmRpY3VsYXJpYV9sYXJnZSRUQVhBX0NPQVJTRT09IkFwcGVuZGljdWxhcmlhIl0gPC0gIkFwcGVuZGljdWxhcmlhX2xhcmdlIgoKCkFwcGVuZGljdWxhcmlhX3NtYWxsIDwtIGZpbHRlcihBcHBlbmRpY3VsYXJpYSwgR0VBUl9OQU1FIT0iNjBCT04iKQoKI1JlY29kZSBjb2Fyc2UgdGF4YQoKQXBwZW5kaWN1bGFyaWFfc21hbGwkVEFYQV9DT0FSU0VbQXBwZW5kaWN1bGFyaWFfc21hbGwkVEFYQV9DT0FSU0U9PSJBcHBlbmRpY3VsYXJpYSJdIDwtICJBcHBlbmRpY3VsYXJpYV9zbWFsbCIKCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEFwcGVuZGljdWxhcmlhX2xhcmdlLCBBcHBlbmRpY3VsYXJpYV9zbWFsbCkKCgpgYGAKCkJpdmFsdmlhCgoKYGBge3J9CgpCaXZhbHZpYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJCaXZhbHZpYSIpCgojQml2YWx2aWEgZXN0aW1hdGUgZnJvbSBzbWFsbGVyIG5ldHMgb25seQoKQml2YWx2aWEgPC0gZmlsdGVyKEJpdmFsdmlhLCBHRUFSX05BTUUhPSI2MEJPTiIpCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBCaXZhbHZpYSkKCgoKCmBgYAoKCkJyYWNoeXVyYQoKYGBge3J9CgpCcmFjaHl1cmEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQnJhY2h5dXJhIikKCiNCcmFjaHl1cmEgZXN0aW1hdGUgZnJvbSA2MEJPTiBvbmx5CgpCcmFjaHl1cmEgPC0gZmlsdGVyKEJyYWNoeXVyYSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBCcmFjaHl1cmEpCgoKCmBgYAoKQ2FsYW51cyBoeXBlcmJvcmV1cwoKCmBgYHtyfQoKQ2FsYW51c19oeXBlcmJvcmV1cyA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJDYWxhbnVzIGh5cGVyYm9yZXVzIikKCgojU2VwYXJhdGUgRU1BIGRhdGEgYXMgdGhleSB3ZXJlIHNvcnRlZCB1bmRlciBkaWZmZXJlbnQgcHJvdG9jb2xzCgpDYWxhbnVzX2h5cGVyYm9yZXVzX0VNQSA8LSBmaWx0ZXIoQ2FsYW51c19oeXBlcmJvcmV1cywgREFUQV9TT1VSQ0U9PSJFTUEiKQpDYWxhbnVzX2h5cGVyYm9yZXVzX0Vjb0RBQVQgPC0gZmlsdGVyKENhbGFudXNfaHlwZXJib3JldXMsIERBVEFfU09VUkNFPT0iRWNvREFBVCIpCgojQ2hlY2sgdG8gc2VlIGlmIHJpZ2h0IHN0YWdlcyBhcmUgaW4gdGhlIEVjb0RBQVQgZGF0YQoKQ2FsYW51c19oeXBlcmJvcmV1c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSA8LSBncm91cF9ieShDYWxhbnVzX2h5cGVyYm9yZXVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk0sIE1FU0gsIEdFQVJfTkFNRSkKCkNhbGFudXNfaHlwZXJib3JldXNfRWNvREFBVF9Gb3JtU3VtbWFyeSA8LSBzdW1tYXJpc2UoQ2FsYW51c19oeXBlcmJvcmV1c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSxuKCkpCgojVGhlc2UgbG9vayBjb3JyZWN0CgojTm93IGZpbHRlciB0aGUgRU1BIGRhdGEgdG8gbWF0Y2ggdGhlIEVjb0RBQVQgZGF0YS4gRU1BIHRlbmRzIHRvIGRvdWJsZSBjb3VudCB2YXJpYWJsZXMgZnJvbSBib3RoIG5ldHMsIHNvIGVsaW1pbmF0ZSB0aGlzCgojQ2hlY2sgdG8gc2VlIGlmIHdoYXQgc3RhZ2VzIGFyZSB3aGVyZSB3aXRoIEVNQSBkYXRhCgpDYWxhbnVzX2h5cGVyYm9yZXVzX0VNQV9ieUdFQVJfTkFNRSA8LSBncm91cF9ieShDYWxhbnVzX2h5cGVyYm9yZXVzX0VNQSwgTUVTSCwgR0VBUl9OQU1FKQoKQ2FsYW51c19oeXBlcmJvcmV1c19FTUFfR2VhclN1bW1hcnkgPC0gc3VtbWFyaXNlKENhbGFudXNfaHlwZXJib3JldXNfRU1BX2J5R0VBUl9OQU1FLCBuKCkpCgojTm8gaXNzdWVzIHdpdGggbWlzbWF0Y2hlZCBtZXNoIGFuZCBnZWFyIHNpemVzLiBOZWVkIHRvIGZpbHRlciBmb3IgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZvciBhdm9pZCBkb3VibGUgY291bnRzCgpDYWxhbnVzX2h5cGVyYm9yZXVzX0VNQSA8LSBmaWx0ZXIoQ2FsYW51c19oeXBlcmJvcmV1c19FTUEsIE1FU0ggIT0gMTUzKQoKCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldAoKQ2FsYW51c19oeXBlcmJvcmV1cyA8LSByYmluZChDYWxhbnVzX2h5cGVyYm9yZXVzX0Vjb0RBQVQsIENhbGFudXNfaHlwZXJib3JldXNfRU1BKQoKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ2FsYW51c19oeXBlcmJvcmV1cykKCgpgYGAKCgpDYWxhbnVzIG1hcnNoYWxsYWUvZ2xhY2lhbGlzCgoKYGBge3J9CgpDYWxhbnVzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkNhbGFudXMgbWFyc2hhbGxhZS9nbGFjaWFsaXMiKQoKI1NlcGFyYXRlIEVNQSBkYXRhIGFzIHRoZXkgd2VyZSBzb3J0ZWQgdW5kZXIgZGlmZmVyZW50IHByb3RvY29scwoKQ2FsYW51c19FTUEgPC0gZmlsdGVyKENhbGFudXMsIERBVEFfU09VUkNFPT0iRU1BIikKQ2FsYW51c19FY29EQUFUIDwtIGZpbHRlcihDYWxhbnVzLCBEQVRBX1NPVVJDRT09IkVjb0RBQVQiKQoKI0NoZWNrIHRvIHNlZSBpZiByaWdodCBzdGFnZXMgYXJlIGluIHRoZSBFY29EQUFUIGRhdGEKCkNhbGFudXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0gPC0gZ3JvdXBfYnkoQ2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNLCBNRVNILCBHRUFSX05BTUUpCgpDYWxhbnVzX0Vjb0RBQVRfRm9ybVN1bW1hcnkgPC0gc3VtbWFyaXNlKENhbGFudXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sbigpKQoKI0RvIHNvbWUgZmlsdGVyaW5nIHRvIGdldCB0aGUgY29ycmVjdCBzdGFnZXMgZnJvbSB0aGUgY29ycmVjdCBnZWFyIGZvciBFY29EQUFUIGRhdGEKCkNhbGFudXNfRWNvREFBVF9CIDwtIGZpbHRlcihDYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJCIikKQ2FsYW51c19FY29EQUFUX0IgPC0gZmlsdGVyKENhbGFudXNfRWNvREFBVF9CLCBNRVNIIT0xNTMpCgpDYWxhbnVzX0Vjb0RBQVRfQyA8LSBmaWx0ZXIoQ2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQyIpCkNhbGFudXNfRWNvREFBVF9DIDwtIGZpbHRlcihDYWxhbnVzX0Vjb0RBQVRfQywgTUVTSD09MTUzKQpDYWxhbnVzX0Vjb0RBQVRfQyA8LSBmaWx0ZXIoQ2FsYW51c19FY29EQUFUX0MsIEdFQVJfTkFNRT09IjIwQk9OIikKCkNhbGFudXNfRWNvREFBVF9HIDwtIGZpbHRlcihDYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJHIikKCkNhbGFudXNfRWNvREFBVF9IIDwtIGZpbHRlcihDYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJIIikKCkNhbGFudXNfRWNvREFBVF9LIDwtIGZpbHRlcihDYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJLIikKCkNhbGFudXNfRWNvREFBVF9MIDwtIGZpbHRlcihDYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJMIikKCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldAoKQ2FsYW51c19FY29EQUFUX0ZpbmFsIDwtIHJiaW5kKENhbGFudXNfRWNvREFBVF9CLCBDYWxhbnVzX0Vjb0RBQVRfQywgQ2FsYW51c19FY29EQUFUX0csIENhbGFudXNfRWNvREFBVF9ILCBDYWxhbnVzX0Vjb0RBQVRfSywgQ2FsYW51c19FY29EQUFUX0wpCgp1bmdyb3VwKENhbGFudXNfRWNvREFBVF9GaW5hbCkKCiNSZW1vdmUgc29tZSBmaWxlcwoKcm0oQ2FsYW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSwgQ2FsYW51c19FY29EQUFUX0IsIENhbGFudXNfRWNvREFBVF9DLCBDYWxhbnVzX0Vjb0RBQVRfRywgQ2FsYW51c19FY29EQUFUX0gsIENhbGFudXNfRWNvREFBVF9LLCBDYWxhbnVzX0Vjb0RBQVRfTCkKCiNOb3cgZmlsdGVyIHRoZSBFTUEgZGF0YSB0byBtYXRjaCB0aGUgRWNvREFBVCBkYXRhLiBFTUEgdGVuZHMgdG8gZG91YmxlIGNvdW50IHZhcmlhYmxlcyBmcm9tIGJvdGggbmV0cywgc28gZWxpbWluYXRlIHRoaXMKCiNDaGVjayB0byBzZWUgaWYgd2hhdCBzdGFnZXMgYXJlIHdoZXJlIHdpdGggRU1BIGRhdGEKCkNhbGFudXNfRU1BX2J5R0VBUl9OQU1FIDwtIGdyb3VwX2J5KENhbGFudXNfRU1BLCBNRVNILCBHRUFSX05BTUUpCgpDYWxhbnVzX0VNQV9HZWFyU3VtbWFyeSA8LSBzdW1tYXJpc2UoQ2FsYW51c19FTUFfYnlHRUFSX05BTUUsIG4oKSkKCiNObyBpc3N1ZXMgd2l0aCBtaXNtYXRjaGVkIG1lc2ggYW5kIGdlYXIgc2l6ZXMuIE5lZWQgdG8gZmlsdGVyIGZvciB0aGUgY29ycmVjdCBzdGFnZXMgZm9yIGF2b2lkIGRvdWJsZSBjb3VudHMKCkNhbGFudXNfRU1BXzYwQk9OIDwtIGZpbHRlcihDYWxhbnVzX0VNQSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKQ2FsYW51c19FTUFfNjBCT05fMzMzIDwtIGZpbHRlcihDYWxhbnVzX0VNQV82MEJPTiwgTUVTSD09MzMzKQoKQ2FsYW51c19FTUFfNjBCT05fMzMzIDwtIGZpbHRlcihDYWxhbnVzX0VNQV82MEJPTl8zMzMsIFNUQUdFX05BTUU9PSJBRFVMVCJ8U1RBR0VfTkFNRT09IkMgLSA1IChDT1BFUE9ESVRFIFYpInxTVEFHRV9OQU1FPT0iQyAtIDQgKENPUEVQT0RJVEUgSVYpInxTVEFHRV9OQU1FPT0iQyAtIDMgKENPUEVQT0RJVEUgSUlJKSIpCgpDYWxhbnVzX0VNQV82MEJPTl81MDUgPC0gZmlsdGVyKENhbGFudXNfRU1BXzYwQk9OLCBNRVNIPT01MDUpCgpDYWxhbnVzX0VNQV82MEJPTl81MDUgPC0gZmlsdGVyKENhbGFudXNfRU1BXzYwQk9OXzUwNSwgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikifFNUQUdFX05BTUU9PSJDIC0gNCAoQ09QRVBPRElURSBJVikiKQoKQ2FsYW51c19FTUFfMjBCT04gPC0gZmlsdGVyKENhbGFudXNfRU1BLCBHRUFSX05BTUU9PSIyMEJPTiIpCgpDYWxhbnVzX0VNQV8yMEJPTl8xNTMgPC0gZmlsdGVyKENhbGFudXNfRU1BXzIwQk9OLCBNRVNIPT0xNTMpCgpDYWxhbnVzX0VNQV8yMEJPTl8xNTMgPC0gZmlsdGVyKENhbGFudXNfRU1BXzIwQk9OXzE1MywgU1RBR0VfTkFNRT09IkMgLSAyIChDT1BFUE9ESVRFIElJKSJ8U1RBR0VfTkFNRT09IkMgLSAxIChDT1BFUE9ESVRFIEkpIikKCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldAoKQ2FsYW51c19FTUFfRmluYWwgPC0gcmJpbmQoQ2FsYW51c19FTUFfNjBCT05fMzMzLCBDYWxhbnVzX0VNQV82MEJPTl81MDUsIENhbGFudXNfRU1BXzIwQk9OXzE1MykKCnVuZ3JvdXAoQ2FsYW51c19FTUFfRmluYWwpCgojUmVtb3ZlIHNvbWUgZmlsZXMKCnJtKENhbGFudXNfRU1BX2J5R0VBUl9OQU1FLCBDYWxhbnVzX0VNQV8yMEJPTiwgQ2FsYW51c19FTUFfMjBCT05fMTUzLCBDYWxhbnVzX0VNQV82MEJPTiwgQ2FsYW51c19FTUFfNjBCT05fMzMzLCBDYWxhbnVzX0VNQV82MEJPTl81MDUpCgojQ29tYmluZSBpbnRvIGZpbmFsLCBDYWxhbnVzIGRhdGEgc2V0CgpDYWxhbnVzIDwtIHJiaW5kKENhbGFudXNfRU1BX0ZpbmFsLCBDYWxhbnVzX0Vjb0RBQVRfRmluYWwpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIENhbGFudXMpCgoKYGBgCgoKQ2FsYW51cyBwYWNpZmljdXMKCgpgYGB7cn0KCkNhbGFudXNfcGFjaWZpY3VzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRSA9PSAiQ2FsYW51cyBwYWNpZmljdXMiKQoKCiNTZXBhcmF0ZSBFTUEgZGF0YSBhcyB0aGV5IHdlcmUgc29ydGVkIHVuZGVyIGRpZmZlcmVudCBwcm90b2NvbHMKCkNhbGFudXNfcGFjaWZpY3VzX0VNQSA8LSBmaWx0ZXIoQ2FsYW51c19wYWNpZmljdXMsIERBVEFfU09VUkNFPT0iRU1BIikKQ2FsYW51c19wYWNpZmljdXNfRWNvREFBVCA8LSBmaWx0ZXIoQ2FsYW51c19wYWNpZmljdXMsIERBVEFfU09VUkNFPT0iRWNvREFBVCIpCgojQ2hlY2sgdG8gc2VlIGlmIHJpZ2h0IHN0YWdlcyBhcmUgaW4gdGhlIEVjb0RBQVQgZGF0YQoKQ2FsYW51c19wYWNpZmljdXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0gPC0gZ3JvdXBfYnkoQ2FsYW51c19wYWNpZmljdXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STSwgTUVTSCwgR0VBUl9OQU1FKQoKQ2FsYW51c19wYWNpZmljdXNfRWNvREFBVF9Gb3JtU3VtbWFyeSA8LSBzdW1tYXJpc2UoQ2FsYW51c19wYWNpZmljdXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sbigpKQoKI1N0YWdlcyBhbmQgZ2VhciBhcmUgY29ycmVjdCBmb3IgRWNvREFBVCBkYXRhCgoKI05vdyBmaWx0ZXIgdGhlIEVNQSBkYXRhIHRvIG1hdGNoIHRoZSBFY29EQUFUIGRhdGEuIEVNQSB0ZW5kcyB0byBkb3VibGUgY291bnQgdmFyaWFibGVzIGZyb20gYm90aCBuZXRzLCBzbyBlbGltaW5hdGUgdGhpcwoKI0NoZWNrIHRvIHNlZSBpZiB3aGF0IHN0YWdlcyBhcmUgd2hlcmUgd2l0aCBFTUEgZGF0YQoKQ2FsYW51c19wYWNpZmljdXNfRU1BX2J5R0VBUl9OQU1FIDwtIGdyb3VwX2J5KENhbGFudXNfcGFjaWZpY3VzX0VNQSwgTUVTSCwgR0VBUl9OQU1FKQoKQ2FsYW51c19wYWNpZmljdXNfRU1BX0dlYXJTdW1tYXJ5IDwtIHN1bW1hcmlzZShDYWxhbnVzX3BhY2lmaWN1c19FTUFfYnlHRUFSX05BTUUsIG4oKSkKCiMgTmVlZCB0byBmaWx0ZXIgZm9yIHRoZSBjb3JyZWN0IHN0YWdlcyBmb3IgYXZvaWQgZG91YmxlIGNvdW50cywganVzdCByZW1vdmUgb25lIEp1ZGF5IHNhbXBsZQoKQ2FsYW51c19wYWNpZmljdXNfRU1BIDwtIGZpbHRlcihDYWxhbnVzX3BhY2lmaWN1c19FTUEsIEdFQVJfTkFNRSE9Ikp1ZGF5IikKCgoKI0NvbWJpbmUgaW50byBmaW5hbCwgQ2FsYW51c19wYWNpZmljdXMgZGF0YSBzZXQKCkNhbGFudXNfcGFjaWZpY3VzIDwtIHJiaW5kKENhbGFudXNfcGFjaWZpY3VzX0VNQSwgQ2FsYW51c19wYWNpZmljdXNfRWNvREFBVCkKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ2FsYW51c19wYWNpZmljdXMpCgoKCgpgYGAKCkNhcmlkZWEKCmBgYHtyfQoKQ2FyaWRlYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0UgPT0gIkNhcmlkZWEiKQoKI0NhcmlkZWEgZXN0aW1hdGUgZnJvbSBsYXJnZXIgbmV0cyBvbmx5CgpDYXJpZGVhIDwtIGZpbHRlcihDYXJpZGVhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIENhcmlkZWEpCgoKYGBgCkNlbnRyb3BhZ2VzIGFiZG9taW5hbGlzCgpgYGB7cn0KCkNlbnRyb3BhZ2VzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkNlbnRyb3BhZ2VzIGFiZG9taW5hbGlzIikKCgojU2VwYXJhdGUgRU1BIGRhdGEgYXMgdGhleSB3ZXJlIHNvcnRlZCB1bmRlciBkaWZmZXJlbnQgcHJvdG9jb2xzCgpDZW50cm9wYWdlc19FTUEgPC0gZmlsdGVyKENlbnRyb3BhZ2VzLCBEQVRBX1NPVVJDRT09IkVNQSIpCkNlbnRyb3BhZ2VzX0Vjb0RBQVQgPC0gZmlsdGVyKENlbnRyb3BhZ2VzLCBEQVRBX1NPVVJDRT09IkVjb0RBQVQiKQoKI0NoZWNrIHRvIHNlZSBpZiByaWdodCBzdGFnZXMgYXJlIGluIHRoZSBFY29EQUFUIGRhdGEKCkNlbnRyb3BhZ2VzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNIDwtIGdyb3VwX2J5KENlbnRyb3BhZ2VzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk0sIE1FU0gsIEdFQVJfTkFNRSkKCkNlbnRyb3BhZ2VzX0Vjb0RBQVRfRm9ybVN1bW1hcnkgPC0gc3VtbWFyaXNlKENlbnRyb3BhZ2VzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLG4oKSkKCgojRmlsdGVyIGZvciBjb3JyZWN0IEdFQVJfTkFNRSBhbmQgTUVTSCBmcm9tIEVjb0RBQVQKCkNlbnRyb3BhZ2VzX0Vjb0RBQVQgPC0gZmlsdGVyKENlbnRyb3BhZ2VzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk0hPSJHIikKCgojTm93IGZpbHRlciB0aGUgRU1BIGRhdGEgdG8gbWF0Y2ggdGhlIEVjb0RBQVQgZGF0YS4gRU1BIHRlbmRzIHRvIGRvdWJsZSBjb3VudCB2YXJpYWJsZXMgZnJvbSBib3RoIG5ldHMsIHNvIGVsaW1pbmF0ZSB0aGlzCgojQ2hlY2sgdG8gc2VlIGlmIHdoYXQgc3RhZ2VzIGFyZSB3aGVyZSB3aXRoIEVNQSBkYXRhCgpDZW50cm9wYWdlc19FTUFfYnlHRUFSX05BTUUgPC0gZ3JvdXBfYnkoQ2VudHJvcGFnZXNfRU1BLCBNRVNILCBHRUFSX05BTUUpCgpDZW50cm9wYWdlc19FTUFfR2VhclN1bW1hcnkgPC0gc3VtbWFyaXNlKENlbnRyb3BhZ2VzX0VNQV9ieUdFQVJfTkFNRSwgbigpKQoKI0ZvciBjb25zaXN0ZW5jeSwgc2VsZWN0IHRoZSBzbWFsbGVyIGdlYXIgb25seQoKQ2VudHJvcGFnZXNfRU1BIDwtIGZpbHRlcihDZW50cm9wYWdlc19FTUEsIEdFQVJfTkFNRSE9IjYwQk9OIikKCgojUmVjb21iaW5lZCBkYXRhCgpDZW50cm9wYWdlcyA8LSByYmluZChDZW50cm9wYWdlc19FY29EQUFULCBDZW50cm9wYWdlc19FTUEpCgoKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ2VudHJvcGFnZXMpCgoKCgoKYGBgCgpDaGFldG9nbmF0aGEKCmBgYHtyfQoKQ2hhZXRvZ25hdGhhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkNoYWV0b2duYXRoYSIpCgojRmlsdGVyIGZvciBDaGFldG9nbmF0aGEgZnJvbSB0aGUgNjBCT04gbmV0cyBvbmx5CgpDaGFldG9nbmF0aGEgPC0gZmlsdGVyKENoYWV0b2duYXRoYSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDaGFldG9nbmF0aGEpCgoKCmBgYAoKQ2lycmlwZWRpYQoKYGBge3J9CgpDaXJyaXBlZGlhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRSA9PSAiQ2lycmlwZWRpYSIpCgojQ2FuIGZpbHRlciBmb3IgYm90aCBnZWFycyBhbmQgdGhlbiBhZGQgYSB0YXhhIGNvYXJzZSBvZiBDaXJyaXBlZGlhX2xhcmdlIGFuZCBDaXJyaXBlZGlhX3NtYWxsCgpDaXJyaXBlZGlhX2xhcmdlIDwtIGZpbHRlcihDaXJyaXBlZGlhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojUmVjb2RlIGNvYXJzZSB0YXhhCgpDaXJyaXBlZGlhX2xhcmdlJFRBWEFfQ09BUlNFW0NpcnJpcGVkaWFfbGFyZ2UkVEFYQV9DT0FSU0U9PSJDaXJyaXBlZGlhIl0gPC0gIkNpcnJpcGVkaWFfbGFyZ2UiCgoKQ2lycmlwZWRpYV9zbWFsbCA8LSBmaWx0ZXIoQ2lycmlwZWRpYSwgR0VBUl9OQU1FIT0iNjBCT04iKQoKI1JlY29kZSBjb2Fyc2UgdGF4YQoKQ2lycmlwZWRpYV9zbWFsbCRUQVhBX0NPQVJTRVtDaXJyaXBlZGlhX3NtYWxsJFRBWEFfQ09BUlNFPT0iQ2lycmlwZWRpYSJdIDwtICJDaXJyaXBlZGlhX3NtYWxsIgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDaXJyaXBlZGlhX2xhcmdlLCBDaXJyaXBlZGlhX3NtYWxsKQoKCgoKYGBgCgpDbGFkb2NlcmEKCmBgYHtyfQoKQ2xhZG9jZXJhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkNsYWRvY2VyYSIpCgojQ2xhZG9jZXJhIGZyb210IGhlIHNtYWxsIG5ldCBvbmx5CgojRmlsdGVyIGZvciBjb3JyZWN0IGdlYXIKCkNsYWRvY2VyYSA8LSBmaWx0ZXIoQ2xhZG9jZXJhLCBHRUFSX05BTUUhPSAiNjBCT04iKQoKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ2xhZG9jZXJhKQoKCmBgYAoKQ2xpb25lIGxpbWFjaW5hCgpgYGB7cn0KCkNsaW9uZSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJDbGlvbmUgbGltYWNpbmEiKQoKI0VzdGltYXRlIGZyb20gdGhlIGxhcmdlciBuZXQgb25seQoKQ2xpb25lIDwtIGZpbHRlcihDbGlvbmUsIEdFQVJfTkFNRT09IjYwQk9OIikKCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIENsaW9uZSkKCgoKCgpgYGAKCkNuaWRhcmlhCgpgYGB7cn0KCkNuaWRhcmlhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRSA9PSAiQ25pZGFyaWEiKQoKI0NhbiBmaWx0ZXIgZm9yIGJvdGggZ2VhcnMgYW5kIHRoZW4gYWRkIGEgdGF4YSBjb2Fyc2Ugb2YgQ25pZGFyaWFfbGFyZ2UgYW5kIENuaWRhcmlhX3NtYWxsCgpDbmlkYXJpYV9sYXJnZSA8LSBmaWx0ZXIoQ25pZGFyaWEsIEdFQVJfTkFNRT09IjYwQk9OIikKCiNSZWNvZGUgY29hcnNlIHRheGEKCkNuaWRhcmlhX2xhcmdlJFRBWEFfQ09BUlNFW0NuaWRhcmlhX2xhcmdlJFRBWEFfQ09BUlNFPT0iQ25pZGFyaWEiXSA8LSAiQ25pZGFyaWFfbGFyZ2UiCgoKQ25pZGFyaWFfc21hbGwgPC0gZmlsdGVyKENuaWRhcmlhLCBHRUFSX05BTUUhPSI2MEJPTiIpCgojUmVjb2RlIGNvYXJzZSB0YXhhCgpDbmlkYXJpYV9zbWFsbCRUQVhBX0NPQVJTRVtDbmlkYXJpYV9zbWFsbCRUQVhBX0NPQVJTRT09IkNuaWRhcmlhIl0gPC0gIkNuaWRhcmlhX3NtYWxsIgoKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ25pZGFyaWFfbGFyZ2UsIENuaWRhcmlhX3NtYWxsKQoKCgpgYGAKClNtYWxsIGFuZCBsYXJnZSBjb3BlcG9kcyB0aGF0IGRvIG5vdCBiZWxvbmcgdG8gbWFqb3IgdGF4b25vbWljIGdyb3VwCgoKYGBge3J9CgoKQ29wZXBvZF9zbWFsbCA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0UgPT0gIkNvcGVwb2Rfc21hbGwiKQoKI0ZpbHRlciBmb3IgdGhlIHNtYWxsZXIgbWVzaCBnZWFycyBvbmx5CgpDb3BlcG9kX3NtYWxsIDwtIGZpbHRlcihDb3BlcG9kX3NtYWxsLCBHRUFSX05BTUUhPSI2MEJPTiIpCgojTm93IGJ1aWxkIHRoZSBsYXJnZSBkYXRhc2V0CgpDb3BlcG9kX2xhcmdlIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRSA9PSAiQ29wZXBvZF9sYXJnZSIpCgojRmlsdGVyIGZvciB0aGUgc21hbGxlciBtZXNoIGdlYXJzIG9ubHkKCkNvcGVwb2RfbGFyZ2UgPC0gZmlsdGVyKENvcGVwb2RfbGFyZ2UsIEdFQVJfTkFNRT09IjYwQk9OIikKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ29wZXBvZF9sYXJnZSwgQ29wZXBvZF9zbWFsbCkKCgoKYGBgCgoKQ3Rlbm9waG9yYQoKYGBge3J9CgpDdGVub3Bob3JhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkN0ZW5vcGhvcmEiKQoKI0ZpbHRlciBmb3IgdGhlIGxhcmdlIG5ldCBvbmx5CgpDdGVub3Bob3JhIDwtIGZpbHRlcihDdGVub3Bob3JhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEN0ZW5vcGhvcmEpCgoKCmBgYAoKCkN1bWFjZWEKCmBgYHtyfQoKQ3VtYWNlYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJDdW1hY2VhIikKCiNGaWx0ZXIgZm9yIHRoZSBsYXJnZSBuZXQgb25seQoKQ3VtYWNlYSA8LSBmaWx0ZXIoQ3VtYWNlYSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDdW1hY2VhKQoKCgpgYGAKCgpEZWNhcG9kYQoKCmBgYHtyfQoKRGVjYXBvZGEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iRGVjYXBvZGEiKQoKI1ZlcnkgZmV3IG1lYXN1cmVtZW50cyBvZiB1bmlkZW50ZmllZCBkZWNhcG9kcy4gV2UgY2FuIGlnbm9yZQoKYGBgCgoKRWNoaW5vZGVybWF0YQoKYGBge3J9CgpFY2hpbm9kZXJtYXRhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkVjaGlub2Rlcm1hdGEiKQoKI0VjaGlub2Rlcm1hdGEgYXJlIHRpbnksIGZpbHRlciBmcm9tIHNtYWxsIG5ldHMgb25seQoKRWNoaW5vZGVybWF0YSA8LSBmaWx0ZXIoRWNoaW5vZGVybWF0YSwgR0VBUl9OQU1FIT0iNjBCT04iKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBFY2hpbm9kZXJtYXRhKQoKCgoKYGBgCgoKRXBpbGFiaWRvY2VyYSBsb25naXBlZGF0YQoKYGBge3J9CgpFcGlsYWJpZG9jZXJhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkVwaWxhYmlkb2NlcmEgbG9uZ2lwZWRhdGEiKQoKCiNTZXBhcmF0ZSBFTUEgZGF0YSBhcyB0aGV5IHdlcmUgc29ydGVkIHVuZGVyIGRpZmZlcmVudCBwcm90b2NvbHMKCkVwaWxhYmlkb2NlcmFfRU1BIDwtIGZpbHRlcihFcGlsYWJpZG9jZXJhLCBEQVRBX1NPVVJDRT09IkVNQSIpCkVwaWxhYmlkb2NlcmFfRWNvREFBVCA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYSwgREFUQV9TT1VSQ0U9PSJFY29EQUFUIikKCiNDaGVjayB0byBzZWUgaWYgcmlnaHQgc3RhZ2VzIGFyZSBpbiB0aGUgRWNvREFBVCBkYXRhCgpFcGlsYWJpZG9jZXJhX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNIDwtIGdyb3VwX2J5KEVwaWxhYmlkb2NlcmFfRWNvREFBVCwgU1BFQ0lNRU5fRk9STSwgTUVTSCwgR0VBUl9OQU1FKQoKRXBpbGFiaWRvY2VyYV9FY29EQUFUX0Zvcm1TdW1tYXJ5IDwtIHN1bW1hcmlzZShFcGlsYWJpZG9jZXJhX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLG4oKSkKCiNUaGluZ3MgYXJlIGNvcnJlY3QgZm9yIHRoZSBFY29EQUFUIGRhdGEsIG5vdCBsb29rIGF0IHRoZSBFTUEgZGF0YQoKCiNOb3cgZmlsdGVyIHRoZSBFTUEgZGF0YSB0byBtYXRjaCB0aGUgRWNvREFBVCBkYXRhLiBFTUEgdGVuZHMgdG8gZG91YmxlIGNvdW50IHZhcmlhYmxlcyBmcm9tIGJvdGggbmV0cywgc28gZWxpbWluYXRlIHRoaXMKCiNDaGVjayB0byBzZWUgaWYgd2hhdCBzdGFnZXMgYXJlIHdoZXJlIHdpdGggRU1BIGRhdGEKCkVwaWxhYmlkb2NlcmFfRU1BX2J5R0VBUl9OQU1FIDwtIGdyb3VwX2J5KEVwaWxhYmlkb2NlcmFfRU1BLCBNRVNILCBHRUFSX05BTUUpCgpFcGlsYWJpZG9jZXJhX0VNQV9HZWFyU3VtbWFyeSA8LSBzdW1tYXJpc2UoRXBpbGFiaWRvY2VyYV9FTUFfYnlHRUFSX05BTUUsIG4oKSkKCgoKI05vIGlzc3VlcyB3aXRoIG1pc21hdGNoZWQgbWVzaCBhbmQgZ2VhciBzaXplcy4gTmVlZCB0byBmaWx0ZXIgZm9yIHRoZSBjb3JyZWN0IHN0YWdlcyBmb3IgYXZvaWQgZG91YmxlIGNvdW50cwoKRXBpbGFiaWRvY2VyYV9FTUFfNjBCT04gPC0gZmlsdGVyKEVwaWxhYmlkb2NlcmFfRU1BLCBHRUFSX05BTUU9PSI2MEJPTiIpCgpFcGlsYWJpZG9jZXJhX0VNQV82MEJPTl8zMzMgPC0gZmlsdGVyKEVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OLCBNRVNIPT0zMzMpCgpFcGlsYWJpZG9jZXJhX0VNQV82MEJPTl8zMzMgPC0gZmlsdGVyKEVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OXzMzMywgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikifFNUQUdFX05BTUU9PSJDIC0gNCAoQ09QRVBPRElURSBJVikifFNUQUdFX05BTUU9PSJDIC0gMyAoQ09QRVBPRElURSBJSUkpIikKCkVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYV9FTUFfNjBCT04sIE1FU0g9PTUwNSkKCkVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYV9FTUFfNjBCT05fNTA1LCBTVEFHRV9OQU1FPT0iQURVTFQifFNUQUdFX05BTUU9PSJDIC0gNSAoQ09QRVBPRElURSBWKSJ8U1RBR0VfTkFNRT09IkMgLSA0IChDT1BFUE9ESVRFIElWKSIpCgpFcGlsYWJpZG9jZXJhX0VNQV8yMEJPTiA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYV9FTUEsIEdFQVJfTkFNRT09IjIwQk9OIikKCkVwaWxhYmlkb2NlcmFfRU1BXzIwQk9OXzE1MyA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYV9FTUFfMjBCT04sIE1FU0g9PTE1MykKCkVwaWxhYmlkb2NlcmFfRU1BXzIwQk9OXzE1MyA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYV9FTUFfMjBCT05fMTUzLCBTVEFHRV9OQU1FPT0iQyAtIDIgKENPUEVQT0RJVEUgSUkpInxTVEFHRV9OQU1FPT0iQyAtIDEgKENPUEVQT0RJVEUgSSkiKQoKI1RoZSBvdGhlciBnZWFycyBhcmUgY29ycmVjdCwgc28gcmVidWlsZCBkYXRhc2V0CgpFcGlsYWJpZG9jZXJhX0VNQV9GaW5hbCA8LSByYmluZChFcGlsYWJpZG9jZXJhX0VNQV82MEJPTl8zMzMsIEVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OXzUwNSwgRXBpbGFiaWRvY2VyYV9FTUFfMjBCT05fMTUzKQoKdW5ncm91cChFcGlsYWJpZG9jZXJhX0VNQV9GaW5hbCkKCiNSZW1vdmUgc29tZSBmaWxlcwoKcm0oRXBpbGFiaWRvY2VyYV9FTUFfYnlHRUFSX05BTUUsIEVwaWxhYmlkb2NlcmFfRU1BXzIwQk9OLCBFcGlsYWJpZG9jZXJhX0VNQV8yMEJPTl8xNTMsIEVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OLCBFcGlsYWJpZG9jZXJhX0VNQV82MEJPTl8zMzMsIEVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OXzUwNSkKCiNDb21iaW5lIGludG8gZmluYWwsIEVwaWxhYmlkb2NlcmEgZGF0YSBzZXQKCkVwaWxhYmlkb2NlcmEgPC0gcmJpbmQoRXBpbGFiaWRvY2VyYV9FTUFfRmluYWwsIEVwaWxhYmlkb2NlcmFfRWNvREFBVCkKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgRXBpbGFiaWRvY2VyYSkKCgpgYGAKCkV1Y2FsYW51cyBidW5naWkKCmBgYHtyfQoKRXVjYWxhbnVzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkV1Y2FsYW51cyBidW5naWkiKQoKCiNTZXBhcmF0ZSBFTUEgZGF0YSBhcyB0aGV5IHdlcmUgc29ydGVkIHVuZGVyIGRpZmZlcmVudCBwcm90b2NvbHMKCkV1Y2FsYW51c19FTUEgPC0gZmlsdGVyKEV1Y2FsYW51cywgREFUQV9TT1VSQ0U9PSJFTUEiKQpFdWNhbGFudXNfRWNvREFBVCA8LSBmaWx0ZXIoRXVjYWxhbnVzLCBEQVRBX1NPVVJDRT09IkVjb0RBQVQiKQoKI0NoZWNrIHRvIHNlZSBpZiByaWdodCBzdGFnZXMgYXJlIGluIHRoZSBFY29EQUFUIGRhdGEKCkV1Y2FsYW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSA8LSBncm91cF9ieShFdWNhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STSwgTUVTSCwgR0VBUl9OQU1FKQoKRXVjYWxhbnVzX0Vjb0RBQVRfRm9ybVN1bW1hcnkgPC0gc3VtbWFyaXNlKEV1Y2FsYW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSxuKCkpCgoKCiNEbyBzb21lIGZpbHRlcmluZyB0byBnZXQgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZyb20gdGhlIGNvcnJlY3QgZ2VhciBmb3IgRWNvREFBVCBkYXRhCgpFdWNhbGFudXNfRWNvREFBVF9BIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkEiKQpFdWNhbGFudXNfRWNvREFBVF9BIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVF9BLCBNRVNIIT0xNTMpCgpFdWNhbGFudXNfRWNvREFBVF9CIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkIiKQpFdWNhbGFudXNfRWNvREFBVF9CIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVF9CLCBNRVNIIT0xNTMpCgpFdWNhbGFudXNfRWNvREFBVF9DIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkMiKQpFdWNhbGFudXNfRWNvREFBVF9DIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVF9DLCBNRVNIPT0xNTMpCgpFdWNhbGFudXNfRWNvREFBVF9GIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkYiKQoKCkV1Y2FsYW51c19FY29EQUFUX0cgPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iRyIpCgpFdWNhbGFudXNfRWNvREFBVF9IIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkgiKQoKRXVjYWxhbnVzX0Vjb0RBQVRfSyA8LSBmaWx0ZXIoRXVjYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJLIikKCkV1Y2FsYW51c19FY29EQUFUX0wgPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iTCIpCgojVGhlIG90aGVyIGdlYXJzIGFyZSBjb3JyZWN0LCBzbyByZWJ1aWxkIGRhdGFzZXQKCkV1Y2FsYW51c19FY29EQUFUX0ZpbmFsIDwtIHJiaW5kKEV1Y2FsYW51c19FY29EQUFUX0EsIEV1Y2FsYW51c19FY29EQUFUX0IsIEV1Y2FsYW51c19FY29EQUFUX0MsIEV1Y2FsYW51c19FY29EQUFUX0YsICBFdWNhbGFudXNfRWNvREFBVF9HLCBFdWNhbGFudXNfRWNvREFBVF9ILCBFdWNhbGFudXNfRWNvREFBVF9LLCBFdWNhbGFudXNfRWNvREFBVF9MKQoKdW5ncm91cChFdWNhbGFudXNfRWNvREFBVF9GaW5hbCkKCiNSZW1vdmUgc29tZSBmaWxlcwoKcm0oRXVjYWxhbnVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLCBFdWNhbGFudXNfRWNvREFBVF9BLCBFdWNhbGFudXNfRWNvREFBVF9CLCBFdWNhbGFudXNfRWNvREFBVF9DLCBFdWNhbGFudXNfRWNvREFBVF9GLCBFdWNhbGFudXNfRWNvREFBVF9HLCBFdWNhbGFudXNfRWNvREFBVF9ILCBFdWNhbGFudXNfRWNvREFBVF9LLCBFdWNhbGFudXNfRWNvREFBVF9MKQoKCgojTm93IGZpbHRlciB0aGUgRU1BIGRhdGEgdG8gbWF0Y2ggdGhlIEVjb0RBQVQgZGF0YS4gRU1BIHRlbmRzIHRvIGRvdWJsZSBjb3VudCB2YXJpYWJsZXMgZnJvbSBib3RoIG5ldHMsIHNvIGVsaW1pbmF0ZSB0aGlzCgojQ2hlY2sgdG8gc2VlIGlmIHdoYXQgc3RhZ2VzIGFyZSB3aGVyZSB3aXRoIEVNQSBkYXRhCgpFdWNhbGFudXNfRU1BX2J5R0VBUl9OQU1FIDwtIGdyb3VwX2J5KEV1Y2FsYW51c19FTUEsIE1FU0gsIEdFQVJfTkFNRSkKCkV1Y2FsYW51c19FTUFfR2VhclN1bW1hcnkgPC0gc3VtbWFyaXNlKEV1Y2FsYW51c19FTUFfYnlHRUFSX05BTUUsIG4oKSkKCiNObyBpc3N1ZXMgd2l0aCBtaXNtYXRjaGVkIG1lc2ggYW5kIGdlYXIgc2l6ZXMuIE5lZWQgdG8gZmlsdGVyIGZvciB0aGUgY29ycmVjdCBzdGFnZXMgZm9yIGF2b2lkIGRvdWJsZSBjb3VudHMKCkV1Y2FsYW51c19FTUFfNjBCT04gPC0gZmlsdGVyKEV1Y2FsYW51c19FTUEsIEdFQVJfTkFNRT09IjYwQk9OIikKCkV1Y2FsYW51c19FTUFfNjBCT05fMzMzIDwtIGZpbHRlcihFdWNhbGFudXNfRU1BXzYwQk9OLCBNRVNIPT0zMzMpCgpFdWNhbGFudXNfRU1BXzYwQk9OXzMzMyA8LSBmaWx0ZXIoRXVjYWxhbnVzX0VNQV82MEJPTl8zMzMsIFNUQUdFX05BTUU9PSJBRFVMVCJ8U1RBR0VfTkFNRT09IkMgLSA1IChDT1BFUE9ESVRFIFYpInxTVEFHRV9OQU1FPT0iQyAtIDQgKENPUEVQT0RJVEUgSVYpInxTVEFHRV9OQU1FPT0iQyAtIDMgKENPUEVQT0RJVEUgSUlJKSIpCgpFdWNhbGFudXNfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoRXVjYWxhbnVzX0VNQV82MEJPTiwgTUVTSD09NTA1KQoKRXVjYWxhbnVzX0VNQV82MEJPTl81MDUgPC0gZmlsdGVyKEV1Y2FsYW51c19FTUFfNjBCT05fNTA1LCBTVEFHRV9OQU1FPT0iQURVTFQifFNUQUdFX05BTUU9PSJDIC0gNSAoQ09QRVBPRElURSBWKSJ8U1RBR0VfTkFNRT09IkMgLSA0IChDT1BFUE9ESVRFIElWKSJ8U1RBR0VfTkFNRT09IkMgLSAzIChDT1BFUE9ESVRFIElJSSkiKQoKRXVjYWxhbnVzX0VNQV8yMEJPTiA8LSBmaWx0ZXIoRXVjYWxhbnVzX0VNQSwgR0VBUl9OQU1FPT0iMjBCT04iKQoKRXVjYWxhbnVzX0VNQV8yMEJPTl8xNTMgPC0gZmlsdGVyKEV1Y2FsYW51c19FTUFfMjBCT04sIE1FU0g9PTE1MykKCkV1Y2FsYW51c19FTUFfMjBCT05fMTUzIDwtIGZpbHRlcihFdWNhbGFudXNfRU1BXzIwQk9OXzE1MywgU1RBR0VfTkFNRT09IkMgLSAyIChDT1BFUE9ESVRFIElJKSJ8U1RBR0VfTkFNRT09IkMgLSAxIChDT1BFUE9ESVRFIEkpIikKCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldAoKRXVjYWxhbnVzX0VNQV9GaW5hbCA8LSByYmluZChFdWNhbGFudXNfRU1BXzYwQk9OXzMzMywgRXVjYWxhbnVzX0VNQV82MEJPTl81MDUsIEV1Y2FsYW51c19FTUFfMjBCT05fMTUzKQoKdW5ncm91cChFdWNhbGFudXNfRU1BX0ZpbmFsKQoKI1JlbW92ZSBzb21lIGZpbGVzCgpybShFdWNhbGFudXNfRU1BX2J5R0VBUl9OQU1FLCBFdWNhbGFudXNfRU1BXzIwQk9OLCBFdWNhbGFudXNfRU1BXzIwQk9OXzE1MywgRXVjYWxhbnVzX0VNQV82MEJPTiwgRXVjYWxhbnVzX0VNQV82MEJPTl8zMzMsIEV1Y2FsYW51c19FTUFfNjBCT05fNTA1KQoKI0NvbWJpbmUgaW50byBmaW5hbCwgRXVjYWxhbnVzIGRhdGEgc2V0CgpFdWNhbGFudXMgPC0gcmJpbmQoRXVjYWxhbnVzX0VNQV9GaW5hbCwgRXVjYWxhbnVzX0Vjb0RBQVRfRmluYWwpCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBFdWNhbGFudXMpCgoKCmBgYAoKRXVwaGF1c2lhY2VhIHBhY2lmaWNhIAoKYGBge3J9CgpFX3BhY2lmaWNhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkV1cGhhdXNpYSBwYWNpZmljYSIpCgojRmlsdGVyIGZvciBsYXJnZSBuZXQgb25seSBhbmQgc3RhZ2VzIGFyZSBhZHVsdCBhbmQganV2ZW5pbGUKCkVfcGFjaWZpY2EgPC0gZmlsdGVyKEVfcGFjaWZpY2EsIEdFQVJfTkFNRT09IjYwQk9OIikKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgRV9wYWNpZmljYSkKCgoKYGBgCgoKRXVwaGF1c2lhY2VhCgpgYGB7cn0KCkV1cGhhdXNpYWNlYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJFdXBoYXVzaWFjZWEiKQoKI0ZpcnN0IHNlcGFyYXRlIG91dCB0aGUgYWR1bHRzIGJlbG9uZ2luZyB0byBUZXNzYXJicmFuY2hpb24gb2N1bGF0dW0KCgkKVGVzc2FyYWJyYWNoaW9uX29jdWxhdHVtIDwtIGZpbHRlciAoRXVwaGF1c2lhY2VhLCBUQVhPTl9OQU1FPT0iVGVzc2FyYWJyYWNoaW9uIG9jdWxhdHVtIikKCgojTm93IGZpbHRlciB0aGUgRXVwaGF1c2lhY2VhIGZvciB0aGUgY29ycmVjdCBzdGFnZXMgYW5kIG5ldHMKCkV1cGhhdXNpYWNlYSA8LSBmaWx0ZXIoRXVwaGF1c2lhY2VhLCBUQVhPTl9OQU1FIT0iVGVzc2FyYWJyYWNoaW9uIG9jdWxhdHVtIikKCiNFbGltaW5hdGUgYWR1bHQgYW5kIGp1dmVuaWxlIHN0YWdlcywgdGhvc2Ugc2hvdWxkIGJlIGlkZW50aWZpZWQgdG8gc3BlY2llcwoKRXVwaGF1c2lhY2VhIDwtIGZpbHRlcihFdXBoYXVzaWFjZWEsIFNUQUdFX05BTUUhPSAiQSArIEogKEFEVUxUL0pVVkVOSUxFKSIpCgpFdXBoYXVzaWFjZWEgPC0gZmlsdGVyKEV1cGhhdXNpYWNlYSwgU1RBR0VfTkFNRSE9ICJKVVZFTklMRSIpCgojR2V0IHJpZCBvZiB0aGUgTk9UIERFVEVSTUlORUQKCkV1cGhhdXNpYWNlYSA8LSBmaWx0ZXIoRXVwaGF1c2lhY2VhLCBTVEFHRV9OQU1FIT0iTk9UIERFVEVSTUlORUQiKQoKI0dldCByaWQgb2YgdGhlIEVHRwoKRXVwaGF1c2lhY2VhIDwtIGZpbHRlcihFdXBoYXVzaWFjZWEsIFNUQUdFX05BTUUhPSJFR0ciKQoKCiNOb3cgY3JlYXRlIHRoZSBmdXJjaWxpYSBkYXRhc2V0CgpFdXBoYXVzaWFjZWFfZnVyY2lsaWEgPC0gZmlsdGVyKEV1cGhhdXNpYWNlYSwgU1RBR0VfTkFNRT09IkZVUkNJTElBIikKCkV1cGhhdXNpYWNlYV9mdXJjaWxpYSA8LSBmaWx0ZXIoRXVwaGF1c2lhY2VhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgoKI05vdyBjcmVhdGUgdGhlIGNhbHl0b3BpcyBkYXRhc2V0CgpFdXBoYXVzaWFjZWFfY2FseXB0b3BpcyA8LSBmaWx0ZXIoRXVwaGF1c2lhY2VhLCBTVEFHRV9OQU1FPT0iQ0FMWVBUT1BJUyAoU1RBR0UgTk9UIERFVEVSTUlORUQpInxTVEFHRV9OQU1FPT0iQ0FMWVBUT1BJUyAxInxTVEFHRV9OQU1FPT0iQ0FMWVBUT1BJUyAyInxTVEFHRV9OQU1FPT0iQ0FMWVBUT1BJUyAzIikKCgojTm93IGNyZWF0ZSB0aGUgbmF1cGxpdXMgZGF0YXNldAoKRXVwaGF1c2lhY2VhX25hdXBsaXVzIDwtIGZpbHRlcihFdXBoYXVzaWFjZWEsIFNUQUdFX05BTUU9PSJOQVVQTElVUyIpCgojRmlsdGVyIGZvciBzbWFsbCBuZXRzIG9ubHkKCkV1cGhhdXNpYWNlYV9uYXVwbGl1cyA8LSBmaWx0ZXIoRXVwaGF1c2lhY2VhX25hdXBsaXVzLCBHRUFSX05BTUUhPSI2MEJPTiIpCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBFdXBoYXVzaWFjZWFfZnVyY2lsaWEsIEV1cGhhdXNpYWNlYV9jYWx5cHRvcGlzLCBFdXBoYXVzaWFjZWFfbmF1cGxpdXMpCgoKCmBgYAoKCkV1cnl0ZW1vcmEgc3BwLgoKYGBge3J9CgpFdXJ5dGVtb3JhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkV1cnl0ZW1vcmEgc3BwLiIpCgojRmlsdGVyIGZyb20gdGhlIHNtYWxsIG5ldHMgb25seQoKRXVyeXRlbW9yYSA8LSBmaWx0ZXIoRXVyeXRlbW9yYSwgR0VBUl9OQU1FIT0iNjBCT04iKQoKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgRXVyeXRlbW9yYSkKCgoKYGBgCgoKR2FzdHJvcG9kYQoKCmBgYHtyfQoKR2FzdHJvcG9kYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJHYXN0cm9wb2RhIikKCiNVbmlkZW50aWZpZWQgZ2FzdHJvcG9kcywgY2FuIHJlbW92ZSBmcm9tIGZpbmFsIGRhdGFzZXQKCgpgYGAKCgpMaW1hY2luYSBoZWxpY2luYQoKCmBgYHtyfQoKTGltYWNpbmEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iTGltYWNpbmEgaGVsaWNpbmEiKQoKI0NhbiBzcGxpdCBpbnRvIGVzdGlhbXRlcyBmcm9tIGxhcmdlIGFuZCBzbWFsbCBuZXRzCgoKTGltYWNpbmFfbGFyZ2UgPC0gZmlsdGVyKExpbWFjaW5hLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojUmVuYW1lIHRoZSBjb2Fyc2UgdGF4YQoKTGltYWNpbmFfbGFyZ2UkVEFYQV9DT0FSU0VbTGltYWNpbmFfbGFyZ2UkVEFYQV9DT0FSU0U9PSJMaW1hY2luYSBoZWxpY2luYSJdIDwtICJMaW1hY2luYV9sYXJnZSIKCiNOb3cgZG8gdGhlIHNtYWxsIG5ldHMKCkxpbWFjaW5hX3NtYWxsIDwtIGZpbHRlcihMaW1hY2luYSwgR0VBUl9OQU1FIT0iNjBCT04iKQoKI1JlbmFtZSB0aGUgY29hcnNlIHRheGEKCkxpbWFjaW5hX3NtYWxsJFRBWEFfQ09BUlNFW0xpbWFjaW5hX3NtYWxsJFRBWEFfQ09BUlNFPT0iTGltYWNpbmEgaGVsaWNpbmEiXSA8LSAiTGltYWNpbmFfc21hbGwiCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBMaW1hY2luYV9sYXJnZSwgTGltYWNpbmFfc21hbGwpCgoKCmBgYAoKTWV0cmlkaWEgbG9uZ2EKCmBgYHtyfQoKTWV0cmlkaWFfbG9uZ2EgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iTWV0cmlkaWEgbG9uZ2EiKQoKI0FkdWx0cywgQzUgb25seSBzbyBhbGwgaXMgZ29vZCwgY2FuIGFkZCB0byBmdWxsIGRhdGEgc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBNZXRyaWRpYV9sb25nYSkKCgpgYGAKCgpNZXRyaWRpYSBva2hvdGVuc2lzCgoKYGBge3J9CgpNZXRyaWRpYV9va2hvdGVuc2lzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09Ik1ldHJpZGlhIG9raG90ZW5zaXMiKQoKCiNBZHVsdHMsIEM0LCBhbmQgQzUgb25seSBzbyBhbGwgaXMgZ29vZCwgY2FuIGFkZCB0byBmdWxsIGRhdGEgc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBNZXRyaWRpYV9va2hvdGVuc2lzKQoKCgoKYGBgCgpNZXRyaWRpYSBwYWNpZmljYQoKCmBgYHtyfQoKTWV0cmlkaWFfcGFjaWZpY2EgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iTWV0cmlkaWEgcGFjaWZpY2EiKQoKCiNTZXBhcmF0ZSBFTUEgZGF0YSBhcyB0aGV5IHdlcmUgc29ydGVkIHVuZGVyIGRpZmZlcmVudCBwcm90b2NvbHMKCk1ldHJpZGlhX3BhY2lmaWNhX0VNQSA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2EsIERBVEFfU09VUkNFPT0iRU1BIikKTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVCA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2EsIERBVEFfU09VUkNFPT0iRWNvREFBVCIpCgojQ2hlY2sgdG8gc2VlIGlmIHJpZ2h0IHN0YWdlcyBhcmUgaW4gdGhlIEVjb0RBQVQgZGF0YQoKTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0gPC0gZ3JvdXBfYnkoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVCwgU1BFQ0lNRU5fRk9STSwgTUVTSCwgR0VBUl9OQU1FKQoKTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9Gb3JtU3VtbWFyeSA8LSBzdW1tYXJpc2UoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sbigpKQoKI0RvIHNvbWUgZmlsdGVyaW5nIHRvIGdldCB0aGUgY29ycmVjdCBzdGFnZXMgZnJvbSB0aGUgY29ycmVjdCBnZWFyIGZvciBFY29EQUFUIGRhdGEKCk1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfQiA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkIiKQpNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0IgPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfQiwgTUVTSCE9MTUzKQoKTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9DIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQyIpCgpNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0cgPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJHIikKCgpNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0ggPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJIIikKCiNSZW1vdmUgQzMgc3RhZ2UKCk1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfSCA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9ILCBTVEFHRV9OQU1FIT0iQyAtIDMgKENPUEVQT0RJVEUgSUlJKSIpCgoKTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9LIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iSyIpCgpNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0wgPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJMIikKCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldAoKTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9GaW5hbCA8LSByYmluZChNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0IsIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfQywgTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9HLCBNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0gsIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfSywgTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9MKQoKdW5ncm91cChNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0ZpbmFsKQoKI1JlbW92ZSBzb21lIGZpbGVzCgpybShNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSwgTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9CLCBNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0MsIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfRywgTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9ILCBNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0ssIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfTCkKCiNOb3cgZmlsdGVyIHRoZSBFTUEgZGF0YSB0byBtYXRjaCB0aGUgRWNvREFBVCBkYXRhLiBFTUEgdGVuZHMgdG8gZG91YmxlIGNvdW50IHZhcmlhYmxlcyBmcm9tIGJvdGggbmV0cywgc28gZWxpbWluYXRlIHRoaXMKCiNDaGVjayB0byBzZWUgaWYgd2hhdCBzdGFnZXMgYXJlIHdoZXJlIHdpdGggRU1BIGRhdGEKCk1ldHJpZGlhX3BhY2lmaWNhX0VNQV9ieUdFQVJfTkFNRSA8LSBncm91cF9ieShNZXRyaWRpYV9wYWNpZmljYV9FTUEsIE1FU0gsIEdFQVJfTkFNRSkKCk1ldHJpZGlhX3BhY2lmaWNhX0VNQV9HZWFyU3VtbWFyeSA8LSBzdW1tYXJpc2UoTWV0cmlkaWFfcGFjaWZpY2FfRU1BX2J5R0VBUl9OQU1FLCBuKCkpCgojTm8gaXNzdWVzIHdpdGggbWlzbWF0Y2hlZCBtZXNoIGFuZCBnZWFyIHNpemVzLiBOZWVkIHRvIGZpbHRlciBmb3IgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZvciBhdm9pZCBkb3VibGUgY291bnRzCgpNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT04gPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0VNQSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OXzMzMyA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OLCBNRVNIPT0zMzMpCgpNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT05fMzMzIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT05fMzMzLCBTVEFHRV9OQU1FPT0iQURVTFQifFNUQUdFX05BTUU9PSJDIC0gNSAoQ09QRVBPRElURSBWKSJ8U1RBR0VfTkFNRT09IkMgLSA0IChDT1BFUE9ESVRFIElWKSIpCgpNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT05fNTA1IDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT04sIE1FU0g9PTUwNSkKCk1ldHJpZGlhX3BhY2lmaWNhX0VNQV82MEJPTl81MDUgPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0VNQV82MEJPTl81MDUsIFNUQUdFX05BTUU9PSJBRFVMVCJ8U1RBR0VfTkFNRT09IkMgLSA1IChDT1BFUE9ESVRFIFYpInxTVEFHRV9OQU1FPT0iQyAtIDQgKENPUEVQT0RJVEUgSVYpIikKCgoKTWV0cmlkaWFfcGFjaWZpY2FfRU1BX3NtYWxsbmV0cyA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRU1BLCBHRUFSX05BTUUhPSI2MEJPTiIpCgpNZXRyaWRpYV9wYWNpZmljYV9FTUFfc21hbGxuZXRzIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FTUFfc21hbGxuZXRzLCBTVEFHRV9OQU1FPT0iQyAtIDEgKENPUEVQT0RJVEUgSSkifFNUQUdFX05BTUU9PSJDIC0gMiAoQ09QRVBPRElURSBJSSkifFNUQUdFX05BTUU9PSJDIC0gMyAoQ09QRVBPRElURSBJSUkpIikKCiNSZW5hbWUgTWV0cmlkaWEgcGFjaWZpYyBvZiBlYXJseSBzdGFnZXMgYXMgTWV0cmlkaWEgc3BwLgoKTWV0cmlkaWFfcGFjaWZpY2FfRU1BX3NtYWxsbmV0cyRUQVhBX0NPQVJTRVtNZXRyaWRpYV9wYWNpZmljYV9FTUFfc21hbGxuZXRzJFRBWEFfQ09BUlNFPT0iTWV0cmlkaWEgcGFjaWZpY2EiXSA8LSAiTWV0cmlkaWEgc3BwLiIKCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldAoKTWV0cmlkaWFfcGFjaWZpY2FfRU1BX0ZpbmFsIDwtIHJiaW5kKE1ldHJpZGlhX3BhY2lmaWNhX0VNQV82MEJPTl8zMzMsIE1ldHJpZGlhX3BhY2lmaWNhX0VNQV82MEJPTl81MDUsIE1ldHJpZGlhX3BhY2lmaWNhX0VNQV9zbWFsbG5ldHMpCgp1bmdyb3VwKE1ldHJpZGlhX3BhY2lmaWNhX0VNQV9GaW5hbCkKCiNSZW1vdmUgc29tZSBmaWxlcwoKcm0oTWV0cmlkaWFfcGFjaWZpY2FfRU1BX2J5R0VBUl9OQU1FLCBNZXRyaWRpYV9wYWNpZmljYV9FTUFfc21hbGxuZXRzLCBNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT04sIE1ldHJpZGlhX3BhY2lmaWNhX0VNQV82MEJPTl8zMzMsIE1ldHJpZGlhX3BhY2lmaWNhX0VNQV82MEJPTl81MDUpCgojQ29tYmluZSBpbnRvIGZpbmFsLCBNZXRyaWRpYV9wYWNpZmljYSBkYXRhIHNldAoKTWV0cmlkaWFfcGFjaWZpY2EgPC0gcmJpbmQoTWV0cmlkaWFfcGFjaWZpY2FfRU1BX0ZpbmFsLCBNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0ZpbmFsKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBNZXRyaWRpYV9wYWNpZmljYSkKCgpgYGAKCk1ldHJpZGlhIHNwcC4KCmBgYHtyfQoKTWV0cmlkaWFfc3BwIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09Ik1ldHJpZGlhIHNwcC4iKQoKI0ZpbHRlciBmb3IgdGhlIHNtYWxsIG5ldHMgb25seQoKTWV0cmlkaWFfc3BwIDwtIGZpbHRlcihNZXRyaWRpYV9zcHAsIEdFQVJfTkFNRSE9IjYwQk9OIikKCiNOb3cgZmlsdGVyIG91dCB0aGUgc3RhZ2VzIHRoYXQgYXJlIGFjY3VyYXRlIGZvciB0aGUgc21hbGwgbmV0cywgYW55dGhpbmcgbGVzcyB0aGFuIHN0YWdlIEMtMwoKTWV0cmlkaWFfc3BwIDwtIGZpbHRlcihNZXRyaWRpYV9zcHAsIFNUQUdFX05BTUUhPSAiQy0xIFRPIEMtNSIpCk1ldHJpZGlhX3NwcCA8LSBmaWx0ZXIoTWV0cmlkaWFfc3BwLCBTVEFHRV9OQU1FIT0gIkMzLTQiKQpNZXRyaWRpYV9zcHAgPC0gZmlsdGVyKE1ldHJpZGlhX3NwcCwgU1RBR0VfTkFNRSE9ICJDMy01IikKTWV0cmlkaWFfc3BwIDwtIGZpbHRlcihNZXRyaWRpYV9zcHAsIFNUQUdFX05BTUUhPSAiQyAtIDQgKENPUEVQT0RJVEUgSVYpIikKCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIE1ldHJpZGlhX3NwcCkKCgpgYGAKCgpNeXNpZHMKCmBgYHtyfQoKTXlzaWRhZSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJNeXNpZGFlIikKCiNGaWx0ZXIgZm9yIDYwQk9OIG5ldHMgb25seQoKTXlzaWRhZSA8LSBmaWx0ZXIoTXlzaWRhZSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgTXlzaWRhZSkKCgoKYGBgCgoKCk5lb2NhbGFudXMgY3Jpc3RhdHVzCgpgYGB7cn0KCkNyaXN0YXR1cyA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJOZW9jYWxhbnVzIGNyaXN0YXR1cyIpCgoKI1NlcGFyYXRlIEVNQSBkYXRhIGFzIHRoZXkgd2VyZSBzb3J0ZWQgdW5kZXIgZGlmZmVyZW50IHByb3RvY29scwoKQ3Jpc3RhdHVzX0VNQSA8LSBmaWx0ZXIoQ3Jpc3RhdHVzLCBEQVRBX1NPVVJDRT09IkVNQSIpCkNyaXN0YXR1c19FY29EQUFUIDwtIGZpbHRlcihDcmlzdGF0dXMsIERBVEFfU09VUkNFPT0iRWNvREFBVCIpCgojQ2hlY2sgdG8gc2VlIGlmIHJpZ2h0IHN0YWdlcyBhcmUgaW4gdGhlIEVjb0RBQVQgZGF0YQoKQ3Jpc3RhdHVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNIDwtIGdyb3VwX2J5KENyaXN0YXR1c19FY29EQUFULCBTUEVDSU1FTl9GT1JNLCBNRVNILCBHRUFSX05BTUUpCgpDcmlzdGF0dXNfRWNvREFBVF9Gb3JtU3VtbWFyeSA8LSBzdW1tYXJpc2UoQ3Jpc3RhdHVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLG4oKSkKCiNEbyBzb21lIGZpbHRlcmluZyB0byBnZXQgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZyb20gdGhlIGNvcnJlY3QgZ2VhciBmb3IgRWNvREFBVCBkYXRhCgpDcmlzdGF0dXNfRWNvREFBVF9BIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkEiKQpDcmlzdGF0dXNfRWNvREFBVF9BIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVF9BLCBNRVNIIT0xNTMpCgpDcmlzdGF0dXNfRWNvREFBVF9CIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkIiKQpDcmlzdGF0dXNfRWNvREFBVF9CIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVF9CLCBNRVNIIT0xNTMpCgpDcmlzdGF0dXNfRWNvREFBVF9DIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkMiKQpDcmlzdGF0dXNfRWNvREFBVF9DIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVF9DLCBNRVNIPT0xNTMpCkNyaXN0YXR1c19FY29EQUFUX0MgPC0gZmlsdGVyKENyaXN0YXR1c19FY29EQUFUX0MsIEdFQVJfTkFNRT09IjIwQk9OIikKCkNyaXN0YXR1c19FY29EQUFUX0YgPC0gZmlsdGVyKENyaXN0YXR1c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iRiIpCgpDcmlzdGF0dXNfRWNvREFBVF9HIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkciKQoKQ3Jpc3RhdHVzX0Vjb0RBQVRfSCA8LSBmaWx0ZXIoQ3Jpc3RhdHVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJIIikKCkNyaXN0YXR1c19FY29EQUFUX0sgPC0gZmlsdGVyKENyaXN0YXR1c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iSyIpCgpDcmlzdGF0dXNfRWNvREFBVF9MIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkwiKQoKI1RoZSBvdGhlciBnZWFycyBhcmUgY29ycmVjdCwgc28gcmVidWlsZCBkYXRhc2V0CgpDcmlzdGF0dXNfRWNvREFBVF9GaW5hbCA8LSByYmluZChDcmlzdGF0dXNfRWNvREFBVF9BLCBDcmlzdGF0dXNfRWNvREFBVF9CLCBDcmlzdGF0dXNfRWNvREFBVF9DLCBDcmlzdGF0dXNfRWNvREFBVF9GLCBDcmlzdGF0dXNfRWNvREFBVF9HLCBDcmlzdGF0dXNfRWNvREFBVF9ILCBDcmlzdGF0dXNfRWNvREFBVF9LLCBDcmlzdGF0dXNfRWNvREFBVF9MKQoKdW5ncm91cChDcmlzdGF0dXNfRWNvREFBVF9GaW5hbCkKCiNSZW1vdmUgc29tZSBmaWxlcwoKcm0oQ3Jpc3RhdHVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLCBDcmlzdGF0dXNfRWNvREFBVF9BLCBDcmlzdGF0dXNfRWNvREFBVF9CLCBDcmlzdGF0dXNfRWNvREFBVF9DLCBDcmlzdGF0dXNfRWNvREFBVF9GLCBDcmlzdGF0dXNfRWNvREFBVF9HLCBDcmlzdGF0dXNfRWNvREFBVF9ILCBDcmlzdGF0dXNfRWNvREFBVF9LLCBDcmlzdGF0dXNfRWNvREFBVF9MKQoKI05vdyBmaWx0ZXIgdGhlIEVNQSBkYXRhIHRvIG1hdGNoIHRoZSBFY29EQUFUIGRhdGEuIEVNQSB0ZW5kcyB0byBkb3VibGUgY291bnQgdmFyaWFibGVzIGZyb20gYm90aCBuZXRzLCBzbyBlbGltaW5hdGUgdGhpcwoKI0NoZWNrIHRvIHNlZSBpZiB3aGF0IHN0YWdlcyBhcmUgd2hlcmUgd2l0aCBFTUEgZGF0YQoKQ3Jpc3RhdHVzX0VNQV9ieUdFQVJfTkFNRSA8LSBncm91cF9ieShDcmlzdGF0dXNfRU1BLCBNRVNILCBHRUFSX05BTUUpCgpDcmlzdGF0dXNfRU1BX0dlYXJTdW1tYXJ5IDwtIHN1bW1hcmlzZShDcmlzdGF0dXNfRU1BX2J5R0VBUl9OQU1FLCBuKCkpCgojTm8gaXNzdWVzIHdpdGggbWlzbWF0Y2hlZCBtZXNoIGFuZCBnZWFyIHNpemVzLiBOZWVkIHRvIGZpbHRlciBmb3IgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZvciBhdm9pZCBkb3VibGUgY291bnRzCgpDcmlzdGF0dXNfRU1BX0ZpbmFsIDwtICBmaWx0ZXIoQ3Jpc3RhdHVzX0VNQSwgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikifFNUQUdFX05BTUU9PSJDIC0gNCAoQ09QRVBPRElURSBJVikifFNUQUdFX05BTUU9PSJDIC0gMyAoQ09QRVBPRElURSBJSUkpIikKCgp1bmdyb3VwKENyaXN0YXR1c19FTUFfRmluYWwpCgoKI05vdyBjb21iaW5lIEVNQSBhbmQgRWNvREFBVCBkYXRhIHRvZ2V0aGVyCgpDcmlzdGF0dXNfRmluYWwgPC0gcmJpbmQoQ3Jpc3RhdHVzX0VNQV9GaW5hbCwgQ3Jpc3RhdHVzX0Vjb0RBQVRfRmluYWwpCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDcmlzdGF0dXNfRmluYWwpCgoKYGBgCgoKTmVvY2FsYW51cyBzcHAuCgpgYGB7cn0KCk5lb2NhbGFudXMgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iTmVvY2FsYW51cyBzcHAuIikKCgojU2VwYXJhdGUgRU1BIGRhdGEgYXMgdGhleSB3ZXJlIHNvcnRlZCB1bmRlciBkaWZmZXJlbnQgcHJvdG9jb2xzCgpOZW9jYWxhbnVzX0VNQSA8LSBmaWx0ZXIoTmVvY2FsYW51cywgREFUQV9TT1VSQ0U9PSJFTUEiKQpOZW9jYWxhbnVzX0Vjb0RBQVQgPC0gZmlsdGVyKE5lb2NhbGFudXMsIERBVEFfU09VUkNFPT0iRWNvREFBVCIpCgojQ2hlY2sgdG8gc2VlIGlmIHJpZ2h0IHN0YWdlcyBhcmUgaW4gdGhlIEVjb0RBQVQgZGF0YQoKTmVvY2FsYW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSA8LSBncm91cF9ieShOZW9jYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk0sIE1FU0gsIEdFQVJfTkFNRSkKCk5lb2NhbGFudXNfRWNvREFBVF9Gb3JtU3VtbWFyeSA8LSBzdW1tYXJpc2UoTmVvY2FsYW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSxuKCkpCgojRG8gc29tZSBmaWx0ZXJpbmcgdG8gZ2V0IHRoZSBjb3JyZWN0IHN0YWdlcyBmcm9tIHRoZSBjb3JyZWN0IGdlYXIgZm9yIEVjb0RBQVQgZGF0YQoKTmVvY2FsYW51c19FY29EQUFUX0IgPC0gZmlsdGVyKE5lb2NhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkIiKQpOZW9jYWxhbnVzX0Vjb0RBQVRfQiA8LSBmaWx0ZXIoTmVvY2FsYW51c19FY29EQUFUX0IsIE1FU0ghPTE1MykKCk5lb2NhbGFudXNfRWNvREFBVF9DIDwtIGZpbHRlcihOZW9jYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJDIikKTmVvY2FsYW51c19FY29EQUFUX0MgPC0gZmlsdGVyKE5lb2NhbGFudXNfRWNvREFBVF9DLCBNRVNIPT0xNTMpCk5lb2NhbGFudXNfRWNvREFBVF9DIDwtIGZpbHRlcihOZW9jYWxhbnVzX0Vjb0RBQVRfQywgR0VBUl9OQU1FPT0iMjBCT04iKQoKTmVvY2FsYW51c19FY29EQUFUX0cgPC0gZmlsdGVyKE5lb2NhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkciKQoKTmVvY2FsYW51c19FY29EQUFUX0ggPC0gZmlsdGVyKE5lb2NhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkgiKQoKTmVvY2FsYW51c19FY29EQUFUX0sgPC0gZmlsdGVyKE5lb2NhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IksiKQoKTmVvY2FsYW51c19FY29EQUFUX0wgPC0gZmlsdGVyKE5lb2NhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkwiKQoKI1RoZSBvdGhlciBnZWFycyBhcmUgY29ycmVjdCwgc28gcmVidWlsZCBkYXRhc2V0CgpOZW9jYWxhbnVzX0Vjb0RBQVRfRmluYWwgPC0gcmJpbmQoTmVvY2FsYW51c19FY29EQUFUX0IsIE5lb2NhbGFudXNfRWNvREFBVF9DLCBOZW9jYWxhbnVzX0Vjb0RBQVRfRywgTmVvY2FsYW51c19FY29EQUFUX0gsIE5lb2NhbGFudXNfRWNvREFBVF9LLCBOZW9jYWxhbnVzX0Vjb0RBQVRfTCkKCnVuZ3JvdXAoTmVvY2FsYW51c19FY29EQUFUX0ZpbmFsKQoKI1JlbW92ZSBzb21lIGZpbGVzCgpybShOZW9jYWxhbnVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLCBOZW9jYWxhbnVzX0Vjb0RBQVRfQiwgTmVvY2FsYW51c19FY29EQUFUX0MsIE5lb2NhbGFudXNfRWNvREFBVF9HLCBOZW9jYWxhbnVzX0Vjb0RBQVRfSCwgTmVvY2FsYW51c19FY29EQUFUX0ssIE5lb2NhbGFudXNfRWNvREFBVF9MKQoKI05vdyBmaWx0ZXIgdGhlIEVNQSBkYXRhIHRvIG1hdGNoIHRoZSBFY29EQUFUIGRhdGEuIEVNQSB0ZW5kcyB0byBkb3VibGUgY291bnQgdmFyaWFibGVzIGZyb20gYm90aCBuZXRzLCBzbyBlbGltaW5hdGUgdGhpcwoKI0NoZWNrIHRvIHNlZSBpZiB3aGF0IHN0YWdlcyBhcmUgd2hlcmUgd2l0aCBFTUEgZGF0YQoKTmVvY2FsYW51c19FTUFfYnlHRUFSX05BTUUgPC0gZ3JvdXBfYnkoTmVvY2FsYW51c19FTUEsIE1FU0gsIEdFQVJfTkFNRSkKCk5lb2NhbGFudXNfRU1BX0dlYXJTdW1tYXJ5IDwtIHN1bW1hcmlzZShOZW9jYWxhbnVzX0VNQV9ieUdFQVJfTkFNRSwgbigpKQoKI05vIGlzc3VlcyB3aXRoIG1pc21hdGNoZWQgbWVzaCBhbmQgZ2VhciBzaXplcy4gTmVlZCB0byBmaWx0ZXIgZm9yIHRoZSBjb3JyZWN0IHN0YWdlcyBmb3IgYXZvaWQgZG91YmxlIGNvdW50cwoKTmVvY2FsYW51c19FTUFfRmluYWwgPC0gIGZpbHRlcihOZW9jYWxhbnVzX0VNQSwgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikifFNUQUdFX05BTUU9PSJDIC0gNCAoQ09QRVBPRElURSBJVikifFNUQUdFX05BTUU9PSJDIC0gMyAoQ09QRVBPRElURSBJSUkpIikKCgp1bmdyb3VwKE5lb2NhbGFudXNfRU1BX0ZpbmFsKQoKCiNOT3cgY29tYmluZSBFTUEgYW5kIEVjb0RBQVQgZGF0YSB0b2dldGhlcgoKTmVvY2FsYW51c19GaW5hbCA8LSByYmluZChOZW9jYWxhbnVzX0VNQV9GaW5hbCwgTmVvY2FsYW51c19FY29EQUFUX0ZpbmFsKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgTmVvY2FsYW51c19GaW5hbCkKCgpgYGAKCgpPaXRob25hIHNwcC4KCmBgYHtyfQoKT2l0aG9uYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJPaXRob25hIHNwcC4iKQoKI0ZpbHRlciBmb3Igc21hbGwgbmV0cyBvbmx5CgpPaXRob25hIDwtIGZpbHRlcihPaXRob25hLCBHRUFSX05BTUUhPSI2MEJPTiIpCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgT2l0aG9uYSkKCgpgYGAKCk9zdHJhY29kYQoKCmBgYHtyfQoKT3N0cmFjb2RhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09Ik9zdHJhY29kYSIpCgoKCmBgYAoKClBvbHljaGFldGEKCmBgYHtyfQoKUG9seWNoYWV0YSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJQb2x5Y2hhZXRhIikKCiNTcGxpdCBpbnRvIHNtYWxsIGFuZCBsYXJnZSBlc3RpbWF0ZXMgZnJvbSB0aGUgY29ycmVjdCBuZXRzIGFuZCBtZXNoZXMKClBvbHljaGFldGFfbGFyZ2UgPC0gZmlsdGVyKFBvbHljaGFldGEsIEdFQVJfTkFNRT09IjYwQk9OIikKCgojUmVuYW1lIFBvbHljaGFldGEgbGFyZ2UKClBvbHljaGFldGFfbGFyZ2UkVEFYQV9DT0FSU0VbUG9seWNoYWV0YV9sYXJnZSRUQVhBX0NPQVJTRT09IlBvbHljaGFldGEiXSA8LSAiUG9seWNoYWV0YV9sYXJnZSIKCgojTm93IGRvIHRoZSBzbWFsbCBuZXRzCgpQb2x5Y2hhZXRhX3NtYWxsIDwtIGZpbHRlcihQb2x5Y2hhZXRhLCBHRUFSX05BTUUhPSI2MEJPTiIpCgojUmVuYW1lIFBvbHljaGFldGEgc21hbGwKClBvbHljaGFldGFfc21hbGwkVEFYQV9DT0FSU0VbUG9seWNoYWV0YV9zbWFsbCRUQVhBX0NPQVJTRT09IlBvbHljaGFldGEiXSA8LSAiUG9seWNoYWV0YV9zbWFsbCIKCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBQb2x5Y2hhZXRhX2xhcmdlLCBQb2x5Y2hhZXRhX3NtYWxsKQoKCgpgYGAKCgpQc2V1ZG9jYWxhbnVzCgpgYGB7cn0KClBzZXVkb2NhbGFudXMgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iUHNldWRvY2FsYW51cyBzcHAuIikKCiNGaWx0ZXIgZm9yIHRoZSBzbWFsbCBuZXRzIG9ubHkKClBzZXVkb2NhbGFudXMgPC0gZmlsdGVyKFBzZXVkb2NhbGFudXMsIEdFQVJfTkFNRSE9IjYwQk9OIikKCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBQc2V1ZG9jYWxhbnVzKQoKCmBgYAoKClRoYWxpYWNlYQoKYGBge3J9CgpUaGFsaWFjZWEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iVGhhbGlhY2VhIikKCmBgYAoKClRoZW1pc3RvIGFieXNzb3J1bQoKYGBge3J9CgpUaGVtaXN0b19hYnlzc29ydW0gPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iVGhlbWlzdG8gYWJ5c3NvcnVtIikKCmBgYAoKClRoZW1pc3RvIGxpYmVsbHVsYQoKYGBge3J9CgpUaGVtaXN0b19saWJlbGx1bGEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iVGhlbWlzdG8gbGliZWxsdWxhIikKCiNGaWx0ZXIgZm9yIHRoZSA2MEJPTiBuZXRzIG9ubHkKClRoZW1pc3RvX2xpYmVsbHVsYSA8LSBmaWx0ZXIoVGhlbWlzdG9fbGliZWxsdWxhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIFRoZW1pc3RvX2xpYmVsbHVsYSkKCmBgYAoKClRoZW1pc3RvIHBhY2lmaWNhCgpgYGB7cn0KClRoZW1pc3RvX3BhY2lmaWNhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IlRoZW1pc3RvIHBhY2lmaWNhIikKCiNGaWx0ZXIgZm9yIHRoZSA2MEJPTiBuZXRzIG9ubHkKClRoZW1pc3RvX3BhY2lmaWNhIDwtIGZpbHRlcihUaGVtaXN0b19wYWNpZmljYSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBUaGVtaXN0b19wYWNpZmljYSkKCgpgYGAKClRoZW1pc3RvIHNwcC4KCmBgYHtyfQoKVGhlbWlzdG8gPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iVGhlbWlzdG8gc3BwLiIpCgojRmlsdGVyIGZvciB0aGUgNjBCT04gbmV0cyBvbmx5CgpUaGVtaXN0bzwtIGZpbHRlcihUaGVtaXN0bywgR0VBUl9OQU1FPT0iNjBCT04iKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBUaGVtaXN0bykKCgpgYGAKCgpUaHlzYW5vZXNzYSBzcGVjaWVzCgpgYGB7cn0KClRoeXNhbm9lc3NhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IlRoeXNhbm9lc3NhIGluZXJtaXMifFRBWEFfQ09BUlNFPT0iVGh5c2Fub2Vzc2EgaW5zcGluYXRhInxUQVhBX0NPQVJTRT09IlRoeXNhbm9lc3NhIGxvbmdpcGVzInxUQVhBX0NPQVJTRT09IlRoeXNhbm9lc3NhIHJhc2NoaWkifFRBWEFfQ09BUlNFPT0iVGh5c2Fub2Vzc2Egc3BpbmlmZXJhIikKCiNTZWxlY3QgZm9yIDYwQk9OIG9ubHkKClRoeXNhbm9lc3NhIDwtIGZpbHRlcihUaHlzYW5vZXNzYSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKI05vdyB0aGUgY29ycmVjdCBzdGFnZXMKClRoeXNhbm9lc3NhIDwtIGZpbHRlcihUaHlzYW5vZXNzYSwgU1RBR0VfTkFNRT09IkEgKyBKIChBRFVMVC9KVVZFTklMRSkifFNUQUdFX05BTUU9PSJKVVZFTklMRSJ8U1RBR0VfTkFNRT09IkFEVUxUIikKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgVGh5c2Fub2Vzc2EpCgpgYGAKCgpUb3J0YW51cyBkaXNjYXVkYXR1cwoKCmBgYHtyfQoKVG9ydGFudXMgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iVG9ydGFudXMgZGlzY2F1ZGF0dXMiKQoKI1NlcGFyYXRlIEVNQSBkYXRhIGFzIHRoZXkgd2VyZSBzb3J0ZWQgdW5kZXIgZGlmZmVyZW50IHByb3RvY29scwoKVG9ydGFudXNfRU1BIDwtIGZpbHRlcihUb3J0YW51cywgREFUQV9TT1VSQ0U9PSJFTUEiKQpUb3J0YW51c19FY29EQUFUIDwtIGZpbHRlcihUb3J0YW51cywgREFUQV9TT1VSQ0U9PSJFY29EQUFUIikKCiNDaGVjayB0byBzZWUgaWYgcmlnaHQgc3RhZ2VzIGFyZSBpbiB0aGUgRWNvREFBVCBkYXRhCgpUb3J0YW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSA8LSBncm91cF9ieShUb3J0YW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNLCBNRVNILCBHRUFSX05BTUUpCgpUb3J0YW51c19FY29EQUFUX0Zvcm1TdW1tYXJ5IDwtIHN1bW1hcmlzZShUb3J0YW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSxuKCkpCgojRWNvREFBVCBkYXRhIGFyZSBjb3JyZWN0bHkgc3BlY2lmaWVkCgoKCiNOb3cgZmlsdGVyIHRoZSBFTUEgZGF0YSB0byBtYXRjaCB0aGUgRWNvREFBVCBkYXRhLiBFTUEgdGVuZHMgdG8gZG91YmxlIGNvdW50IHZhcmlhYmxlcyBmcm9tIGJvdGggbmV0cywgc28gZWxpbWluYXRlIHRoaXMKCiNDaGVjayB0byBzZWUgaWYgd2hhdCBzdGFnZXMgYXJlIHdoZXJlIHdpdGggRU1BIGRhdGEKClRvcnRhbnVzX0VNQV9ieUdFQVJfTkFNRSA8LSBncm91cF9ieShUb3J0YW51c19FTUEsIE1FU0gsIEdFQVJfTkFNRSkKClRvcnRhbnVzX0VNQV9HZWFyU3VtbWFyeSA8LSBzdW1tYXJpc2UoVG9ydGFudXNfRU1BX2J5R0VBUl9OQU1FLCBuKCkpCgojTm8gaXNzdWVzIHdpdGggbWlzbWF0Y2hlZCBtZXNoIGFuZCBnZWFyIHNpemVzLiBOZWVkIHRvIGZpbHRlciBmb3IgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZvciBhdm9pZCBkb3VibGUgY291bnRzCgpUb3J0YW51c19FTUFfNjBCT04gPC0gZmlsdGVyKFRvcnRhbnVzX0VNQSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKVG9ydGFudXNfRU1BXzYwQk9OXzMzMyA8LSBmaWx0ZXIoVG9ydGFudXNfRU1BXzYwQk9OLCBNRVNIPT0zMzMpCgpUb3J0YW51c19FTUFfNjBCT05fMzMzIDwtIGZpbHRlcihUb3J0YW51c19FTUFfNjBCT05fMzMzLCBTVEFHRV9OQU1FPT0iQURVTFQifFNUQUdFX05BTUU9PSJDIC0gNSAoQ09QRVBPRElURSBWKSIpCgpUb3J0YW51c19FTUFfNjBCT05fNTA1IDwtIGZpbHRlcihUb3J0YW51c19FTUFfNjBCT04sIE1FU0g9PTUwNSkKClRvcnRhbnVzX0VNQV82MEJPTl81MDUgPC0gZmlsdGVyKFRvcnRhbnVzX0VNQV82MEJPTl81MDUsIFNUQUdFX05BTUU9PSJBRFVMVCJ8U1RBR0VfTkFNRT09IkMgLSA1IChDT1BFUE9ESVRFIFYpIikKCgoKVG9ydGFudXNfRU1BX3NtYWxsbmV0cyA8LSBmaWx0ZXIoVG9ydGFudXNfRU1BLCBHRUFSX05BTUUhPSI2MEJPTiIpCgoKVG9ydGFudXNfRU1BX3NtYWxsbmV0cyA8LSBmaWx0ZXIoVG9ydGFudXNfRU1BX3NtYWxsbmV0cywgU1RBR0VfTkFNRT09IkMgLSA0IChDT1BFUE9ESVRFIElWKSJ8U1RBR0VfTkFNRT09IkMgLSAzIChDT1BFUE9ESVRFIElJSSkifFNUQUdFX05BTUU9PSJDIC0gMiAoQ09QRVBPRElURSBJSSkifFNUQUdFX05BTUU9PSJDIC0gMSAoQ09QRVBPRElURSBJKSIpCgojVGhlIG90aGVyIGdlYXJzIGFyZSBjb3JyZWN0LCBzbyByZWJ1aWxkIGRhdGFzZXQKClRvcnRhbnVzX0VNQV9GaW5hbCA8LSByYmluZChUb3J0YW51c19FTUFfNjBCT05fMzMzLCBUb3J0YW51c19FTUFfNjBCT05fNTA1LCBUb3J0YW51c19FTUFfc21hbGxuZXRzKQoKdW5ncm91cChUb3J0YW51c19FTUFfRmluYWwpCgojUmVtb3ZlIHNvbWUgZmlsZXMKCnJtKFRvcnRhbnVzX0VNQV9ieUdFQVJfTkFNRSwgIFRvcnRhbnVzX0VNQV9zbWFsbG5ldHMsIFRvcnRhbnVzX0VNQV82MEJPTiwgVG9ydGFudXNfRU1BXzYwQk9OXzMzMywgVG9ydGFudXNfRU1BXzYwQk9OXzUwNSkKCiNDb21iaW5lIGludG8gZmluYWwsIFRvcnRhbnVzIGRhdGEgc2V0CgpUb3J0YW51cyA8LSByYmluZChUb3J0YW51c19FTUFfRmluYWwsIFRvcnRhbnVzX0Vjb0RBQVQpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIFRvcnRhbnVzKQoKCmBgYApOb3cgZG8gYmlvbWFzcyBjb252ZXJzaW9ucwoKCmBgYHtyfQoKI05PdyByZWFkIGluIHRoZSBiaW9tYXNzIGNvbnZlcnNpb24gZGF0YSBzZXQKCkJpb21hc3NfYW5ub3RhdGVkIDwtIHJlYWRfeGxzeChoZXJlKCJkYXRhIiwgIkJpb21hc3MiLCAiQmlvbWFzcy1Bbm5vdGF0ZWQueGxzeCIpKQoKI01lcmdlIHRoZSB0d28gZGF0YSBzZXRzIGJhc2VkIG9uIFRBWEFfQ09BUlNFLCBTVEFHRV9OQU1FLCBTRVhfTkFNRQoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSBsZWZ0X2pvaW4oTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQmlvbWFzc19hbm5vdGF0ZWQsIGJ5ID0gYygiVEFYQV9DT0FSU0UiLCAiU1RBR0VfTkFNRSIsICJTRVhfTkFNRSIpKQoKI0RvIHNvbWUgdGlkeWluZyB0byBlbGltaW5hdGUgc29tZSBjb2x1bW5zCgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsJE5PVEUgPC0gTlVMTApOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsJElORF9XV19NR19OT1RFIDwtIE5VTEwKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCRJTkRfRFdfTUdfQ09OVkVSVEVEX05PVEUgPC0gTlVMTApOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsJElORF9DX01HX0NPTlZFUlRFRF9OT1RFIDwtIE5VTEwKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCRHUk9XVEhfUkFURV9OT1RFIDwtIE5VTEwKCiNDcmVhdGUgd2V0IHdlaWdodCBiaW9tYXNzIGNvbHVtbiBjb252ZXJ0ZWQgaW5kaXZpZHVhbCB3ZXQgd2VpZ2h0IGFuZCBhYnVuZGFuY2UKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbXV0YXRlKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEJJT01BU1NfV1dfTUdfTTNfTUVBTiA9IElORF9XV19NR19NRUFTVVJFRF9NRUFOKkVTVF9OVU1fUEVSTTMpCgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIG11dGF0ZShOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBCSU9NQVNTX1dXX01HX00zX1NEID0gSU5EX1dXX01HX01FQVNVUkVEX1NEKkVTVF9OVU1fUEVSTTMpCgojQ3JlYXRlIGRyeSB3ZWlnaHQgYmlvbWFzcyBjb2x1bW4gY29udmVydGVkIGluZGl2aWR1YWwgZHJ5IHdlaWdodCBhbmQgYWJ1bmRhbmNlCgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIG11dGF0ZShOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBCSU9NQVNTX0RXX01HX00zX01FQU4gPSBJTkRfRFdfTUdfQ09OVkVSVEVEX01FQU4qRVNUX05VTV9QRVJNMykKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbXV0YXRlKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEJJT01BU1NfRFdfTUdfTTNfU0QgPSBJTkRfRFdfTUdfQ09OVkVSVEVEX1NEKkVTVF9OVU1fUEVSTTMpCgojQ3JlYXRlIGNhcmJvbiB3ZWlnaHQgYmlvbWFzcyBjb2x1bW4gY29udmVydGVkIGluZGl2aWR1YWwgY2FyYm9uIHdlaWdodCBhbmQgYWJ1bmRhbmNlCgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIG11dGF0ZShOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBCSU9NQVNTX0NfTUdfTTNfTUVBTiA9IElORF9DX01HX0NPTlZFUlRFRF9NRUFOKkVTVF9OVU1fUEVSTTMpCgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIG11dGF0ZShOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBCSU9NQVNTX0NfTUdfTTNfU0QgPSBJTkRfQ19NR19DT05WRVJURURfU0QqRVNUX05VTV9QRVJNMykKCgojQ3JlYXRlIGNhcmJvbiB3ZWlnaHQgYmlvbWFzcyBjb2x1bW4gY29udmVydGVkIGluZGl2aWR1YWwgY2FyYm9uIHdlaWdodCBhbmQgYWJ1bmRhbmNlCgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIG11dGF0ZShOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBQUk9EVUNUSU9OX01HX0NfRF9NRUFOID0gKElORF9DX01HX0NPTlZFUlRFRF9NRUFOKkVTVF9OVU1fUEVSTTMqR1JPV1RIX1JBVEVfTUVBTikqMjQpCgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIG11dGF0ZShOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBQUk9EVUNUSU9OX01HX0NfRF9TRCA9IChJTkRfQ19NR19DT05WRVJURURfU0QqRVNUX05VTV9QRVJNMypHUk9XVEhfUkFURV9TRCkqMjQpCgoKYGBgCgoKTm93IHdyaXRlIHByb2Nlc3NlZCBkYXRhc2V0IGFmdGVyIGFkZGluZyBiaW9tYXNzIGluZm9ybWF0aW9uCgpgYGB7cn0KCndyaXRlLmNzdihOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBoZXJlKCJkYXRhIiwgIlByb2Nlc3NlZF9EYXRhIiwgIk5CU19ab29wX1Byb2Nlc3NfRmluYWwuY3N2IiksIHJvdy5uYW1lcyA9IEZBTFNFKQoKYGBgCgoK